【发布时间】:2012-02-06 14:06:41
【问题描述】:
我正在编写一个使用__setattr__ 和__getattr__ 提供自定义属性访问的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__?
【问题讨论】:
标签: python attributes setter descriptor