사용자 정의 동작을 추가하기 위해 사전에서 상속받은 클래스가 있습니다.이 경우 유효성 검사를 위해 각 키와 값을 전달합니다. 아래 예제에서 '유효성 검사'는 단순히 메시지를 인쇄합니다.사용자 정의 dict 클래스를 Python 클래스의 __dict__ 속성으로 사용하는 동작이 이상합니다.
사전 할당은 예상대로 작동하며 항목이 dict에 추가 될 때마다 메시지를 인쇄합니다. 그러나 클래스의 __dict__
특성으로 사용자 지정 사전 형식을 사용하려고 할 때 키/값을 사용자 지정 사전 클래스에 넣는 특성 할당은 어떻게 든 __setitem__
을 우회하는 동시에 사전에 값을 삽입하는 것을 관리합니다. 키를 추가 할 수있는 정의 된 메서드).
사용자 지정 사전 :
from collections import MutableMapping
class ValidatedDict(dict):
"""A dictionary that passes each value it ends up storing through
a given validator function.
"""
def __init__(self, validator, *args, **kwargs):
self.__validator = validator
self.update(*args, **kwargs)
def __setitem__(self, key, value):
self.__validator(value)
self.__validator(key)
dict.__setitem__(self, key, value)
def copy(self): pass # snipped
def fromkeys(validator, seq, v = None): pass # snipped
setdefault = MutableMapping.setdefault
update = MutableMapping.update
def Validator(i): print "Validating:", i
이해가 안 클래스 수익률 행동의 __dict__
속성으로 사용.
>>> d = ValidatedDict(Validator)
>>> d["key"] = "value"
Validating: value
Validating: key
>>> class Foo(object): pass
...
>>> foo = Foo()
>>> foo.__dict__ = ValidatedDict(Validator)
>>> type(foo.__dict__)
<class '__main__.ValidatedDict'>
>>> foo.bar = 100 # Yields no message!
>>> foo.__dict__['odd'] = 99
Validating: 99
Validating: odd
>>> foo.__dict__
{'odd': 99, 'bar': 100}
내가 예상 한대로 동작하지 않는 이유를 설명 할 수 있습니까? 시도하고있는 방식대로 작동 할 수 있습니까?
꼭해야한다면'__new__'을 제외하고는'__dict__'을 대체해서는 안된다고 생각합니다. 여기서하려고하는 것은 커스텀'__setattribute__' 메소드로 수행되어야합니다. –
솔직히 말해서, 나는 정말로 "무엇인가하려합니다". 나는 유효성 검사를하는 dict 클래스를 작성하고 있었고, 단지 재미를 위해서 그것을'__dict__' 인스턴스로 사용하려고했습니다. 내 질문에 대한 이유는 정말 그것이 왜 이런 식으로 행동하는지 이해하고 주변을 둘러볼 수 있는지 여부를 이해하기 위해서입니다. – porgarmingduod