2012-10-26 2 views
1

저는 Python 2.7에서 메타 클래스를 사용하고 있습니다. 그래서 다음과 같습니다 코드 생성 :사용자 정의 메타 클래스 동작이있는 Python 메타 클래스

class M(type): 
    def __new__(meta, name, parents, attrs): 
     print 'In meta new' 
     return super(meta, meta).__new__(meta, name, parents, attrs) 

    def __init__(cls, *args, **kwargs): 
     print 'In meta init' 

    def __call__(cls, *attr, **val): 
     print 'In meta call' 
     return super(cls, cls).__new__(cls) 

class A(object): 
    __metaclass__ = M 

    def __new__(cls): 
     print 'In class new' 
     return super(cls, cls).__new__(cls) 

    def __init__(self): 
     print 'In object init' 

    def __call__(self): 
     print 'In object call' 

을하지만 출력이 나를 혼란 :

A() 

In meta new 
In meta init 
In meta call 

어떻게 든 클래스 방법 __ 새로운 __ 및 __ 초기화 __ 오버라이드 (override), 그래서 통역은 단지 그들을 건너 뛸 수 있었다. 누구든지이 물건을 설명 할 수 있습니까?

도움 주셔서 감사합니다.

답변

1

super()으로 잘못 부르고 있습니다. super()의 첫 번째 인수는 클래스 자체인데이 아닌 인스턴스입니다.

return super(meta, meta).__new__(meta, name, parents, attrs) 

해야 ...

return super(M, meta).__new__(meta, name, parents, attrs) 

등 다른 super() 통화 - 첫 번째 인수가 그들이 내있는 클래스해야한다; 두 번째는 실제 인스턴스입니다.

+0

이것은 다른 이유로 작동하지 않습니다. – alexvassel

0

내가 원래 파이썬 메커니즘을 사용하지 않기 때문에 그것은 작동하지 않습니다 - cls()__new____init__ 방법의 자동 작동을 보증한다, 그것은 동일한 작업을 수행하지 않는 메타 클래스 __call__ 방법에 의해 무시된다.

관련 문제