我在寫一個python類,它使用__setattr__
和__getattr__
來提供自定義屬性訪問。使用__setattr__和描述符爲python類
但是,某些屬性不能用通用的方式處理,所以我希望爲這些屬性使用描述符。
產生了一個問題,對於一個描述符,描述符的__get__
將對該情況__getattr__
的調用,而是分配給的屬性時,將__setattr__
有利於描述__set__
的調用。
一個例子:
class MyDesc(object):
def __init__(self):
self.val = None
def __get__(self, instance, owner):
print "MyDesc.__get__"
return self.val
def __set__(self, instance, value):
print "MyDesc.__set__"
self.val = value
class MyObj(object):
foo = MyDesc()
def __init__(self, bar):
object.__setattr__(self, 'names', dict(
bar=bar,
))
object.__setattr__(self, 'new_names', dict())
def __setattr__(self, name, value):
print "MyObj.__setattr__ for %s" % name
self.new_names[name] = value
def __getattr__(self, name):
print "MyObj.__getattr__ for %s" % name
if name in self.new_names:
return self.new_names[name]
if name in self.names:
return self.names[name]
raise AttributeError(name)
if __name__ == "__main__":
o = MyObj('bar-init')
o.bar = 'baz'
print o.bar
o.foo = 'quux'
print o.foo
打印:
MyObj.__setattr__ for bar
MyObj.__getattr__ for bar
baz
MyObj.__setattr__ for foo
MyDesc.__get__
None
描述符的__set__
永遠不會被調用。
由於__setattr__
定義不只是壓倒一切行爲一組有限的名字,還有,它可以推遲到object.__setattr__
不明白的地方是否有必須分配給屬性使用描述一個推薦的方式,如果可用,並且__setattr__
否則?
裝飾器可以輕鬆實現你第二種方法是行不通的。在我的例子,你被允許在對象上設置新的屬性,這些屬性並沒有存在,這種方法將不允許。 – SpoonMeiser 2012-02-06 15:22:38
@SpoonMeiser,我認爲它就像你的。看看http://ideone.com/HMBcc。也許我誤解了一些東西。 – reclosedev 2012-02-06 15:41:31
如果我做'o .quux = 3',然後'o .__ dict __ ['quux']'將被設置而不是'o.new_names ['quux']' – SpoonMeiser 2012-02-06 15:50:10