在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。 –