저는 사용자 정의 속성 액세스를 제공하기 위해 __setattr__
과 __getattr__
을 사용하는 파이썬 클래스를 작성하고 있습니다.파이썬 클래스에 __setattr__과 설명자를 모두 사용합니다.
그러나 일부 속성은 일반적인 방법으로 처리 할 수 없으므로 해당 속성에 대해 설명자를 사용하고 싶습니다.
문제는, 기술자의 __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
인쇄 : 기술자의이 __set__
가 호출되지 않습니다
MyObj.__setattr__ for bar
MyObj.__getattr__ for bar
baz
MyObj.__setattr__ for foo
MyDesc.__get__
None
. __setattr__
정의는 단지 이름의 제한된 집합에 대한 동작을 오버라이드 (override)되지 않기 때문에
는 경우, 속성에 기술자를 사용하여 할당해야하는 권장 방법이 있나요이 object.__setattr__
로 연기 할 수 명확한 곳이 없습니다 사용할 수 있으며 __setattr__
? 가능한 방법의
위한 장식으로 달성 될 수있다. 내 예를 들어, 당신은 개체에 새 속성을 설정할 수있어 그 이미 존재하지 않았고,이 방법은 그것을 허용하지 않을 것입니다. – SpoonMeiser
@SpoonMeiser, 나는 당신의 것과 비슷하다고 생각합니다 .http : //ideone.com/HMBcc보세요. 아마도 내가 놓친 것 같아요. – reclosedev
만약 제가' 'quux'] '대신'o.__ dict __ ['quux ']'가 설정됩니다. – SpoonMeiser