gpt4 book ai didi

python - 类属性和 __setattr__

转载 作者:太空狗 更新时间:2023-10-29 17:11:23 30 4
gpt4 key购买 nike

在 Python 类中,当我使用 __setattr__ 时,它优先于此类(或任何基类)中定义的属性。考虑以下代码:

class Test(object):
def get_x(self):
x = self._x
print "getting x: %s" % x
return x
def set_x(self, val):
print "setting x: %s" % val
self._x = val
x = property(get_x, set_x)
def __getattr__(self, a):
print "getting attr %s" % a
return -1
def __setattr__(self, a, v):
print "setting attr %s" % a

当我创建类并尝试设置 x 时,将调用 __setattr__ 而不是 set_x:

>>> test = Test()
>>> test.x = 2
setting attr x
>>> print test.x
getting attr x_
getting x: -1
-1

我想要实现的是 __setattr__ 中的实际代码只有在没有相关属性时才被调用,即 test.x = 2 应该调用 set_x 。我知道我可以通过手动检查 a 是否为“x”是否为 __setattr__ 轻松实现此目的,但是这会导致设计不佳。对于类和所有基类中定义的每个属性,是否有更聪明的方法来确保 __setattr__ 中的正确行为?

最佳答案

Python 用于属性的搜索顺序是这样的:

  1. __getattribute____setattr__
  2. 数据描述符,如property
  3. 来自对象的__dict__的实例变量(设置属性时,搜索到此结束)
  4. 非数据描述符(如方法)和其他类变量
  5. __getattr__

因为 __setattr__ 排在第一位,如果你有一个你需要让它变得聪明,除非想让它处理你的类的所有属性设置。它可以通过两种方式变得聪明:让它只处理一组特定的属性,或者让它处理除了某些属性集之外的所有属性。对于您不想让它处理的那些,请调用 super().__setattr__

对于您的示例类,处理“除‘x’之外的所有属性”可能是最简单的:

def __setattr__(self, name, value):
if name == "x":
super(Test, self).__setattr__(name, value)
else:
print "setting attr %s" % name

关于python - 类属性和 __setattr__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15750522/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com