메타 클래스로 생성 된 모든 클래스에 속성을 추가하고 싶습니다. 예를 들어, C
이라는 클래스가 생성되면 C._C__sup
값이 설명자 super(C)
인 속성을 추가하고 싶습니다.파이썬 __super black magic failed
class Meta(type):
def __init__(cls, name, bases, dict): # Not overriding type.__new__
cls.__dict__['_' + name + '__sup'] = super(cls)
# Not calling type.__init__; do I need it?
class C(object):
__metaclass__ = Meta
c = C()
print c._C__sup
이 저를 제공합니다 : 여기
내가 무엇을 시도했다입니다TypeError: Error when calling the metaclass bases
'dictproxy' object does not support item assignment
배경 정보 :
이 (당신은이 부분을 읽을 필요가 없습니다)
영감 this article에 의해, 무엇을 내가 뭘하는 super
를 사용하는 경우 "하드 코딩"클래스 이름을 방지하기 위해 노력하고있다 :
아이디어는 개인 속성과 결합되지 않은 슈퍼 객체를 사용하는 것이있다.
>>> C._C__sup = super(C)
구문이
self.__sup.meth
가 대안으로 사용할 수있는 방법 안쪽이 정의와 : 예를 들어, 우리의 예제에서, 우리는 언 바운드 슈퍼 객체super(C)
로 클래스C
의 개인 속성__sup
을 정의 할 수 있습니다 ~super(C, self).meth
. 의 이점은 호출 구문에서 클래스 이름을 반복하지 않아야한다는 것입니다.이 이름은 private 이름의 메커니즘을 통해 숨겨져 있기 때문입니다.__sup
속성의 생성은 메타 클래스에서 숨겨져 자동으로 수행 될 수 있습니다. 그럼,이 모든 것 같습니다 : 그러나 사실이 경우가 아닙니다.