2017-12-27 28 views
1

나는 믹서를 데코레이터가있는 클래스에 주입하려고합니다. 코드가 실행될 때 클래스에 더 이상 dict 속성이 없습니다 (인스턴스 (dir)에 인스턴스가 있음). 나는 부동산이 어디에서 사라지고 있는지 모르겠습니다. dict을 얻거나 그렇지 않으면 인스턴스의 속성을 찾을 수있는 방법이 있습니까?믹스 인 주사 후 __dict__을 잃는 파이썬 객체

def testDecorator(cls): 
    return type(cls.__name__, (Mixin,) + cls.__bases__, dict(cls.__dict__)) 

class Mixin:   
    pass 

@testDecorator 
class dummyClass: 
    def __init__(self): 
     self.testVar1 = 'test' 
     self.testVar2 = 3.14 

inst = dummyClass() 
print(dir(inst)) 
print(inst.__dict__) 

이 코드는 데코레이터가 주석 처리되어 있지만 데코레이터가있을 때 오류가 발생하면 작동합니다. 파이썬에서 실행 3.5.1

답변

3

그것은 "잃고 __dict__"아니에요. 원래 dummyClass의 원래 dummyClass 인스턴스의 __dict__ 속성을 검색하기 위해 의도 된 __dict__descriptor이 있지만 데코레이터가 해당 설명자를 원본에서 오지 않은 새 dummyClass에 넣습니다.

상속 관계가 없기 때문에 새 클래스의 인스턴스와 함께 원래 __dict__ 설명자를 사용하는 것은 안전하지 않으며 새 클래스의 인스턴스는 자신의 메모리 레이아웃에서 다른 오프셋에 dict 포인터를 가질 수 있습니다. (새로운`__dict__`

def testDecorator(cls): 
    return type(cls.__name__, (Mixin, cls), {}) 
+1

단순히 type''에 전달 된 매핑에서 __dict__' 또한 작동합니다'절개 :이 문제를 해결하려면, 당신의 장식이 대신 DICT와 기지를 복사하는 원래의 하위 클래스를 만들 수 있습니다 설명자가 자동으로 생성됩니다. '__weakref__'도 제거하는 것이 좋습니다. – BrenBarn

+0

글쎄,'Mixin'은 자체의'__dict__ '기술자를 가지고 있기 때문에, 새로운 것을 생성하는 대신에 그 기술을 사용하게됩니다.하지만'__dict__'를 삭제하면 작동 할 것입니다. – user2357112