私はカスタム属性へのアクセスを提供するために __ 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 __
は呼び出されません。
Since the __setattr__
definition isn't just overriding behaviour for a limited set of names, there's no clear place that it can defer to object.__setattr__
可能であれば、記述子を使用する属性に割り当てることを推奨する方法はありますか?それ以外の場合は __ setattr __
?