在Python类中,当我使用__setattr__
时,它优先于此类(或任何基类)中定义的属性。请看下面的代码:类属性和__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__
中针对类和所有基类中定义的每个属性的正确行为?
您可以使用描述符:http://docs.python.org/2/howto/descriptor.html –
注意:使用'@ properety'装饰器使属性更清晰:http://docs.python.org/2 /library/functions.html#property - 你的问题是如何定义属性函数在子类中定义的? – ninMonkey
“@ property”装饰器等于'x = property(...)',并且使用它不会改变行为。我没有在示例中使用它,因为我希望能够明确引用'set_x' setter。 –