2011-09-20 5 views
5

내가 메타 클래스를 가지고 말 ProductClass의 __init__이 (가) 트리거 되었습니까? Meta의 __call__ 때문에?메타 클래스의 "__call__"및 제품 수준의 "__init__"

UPDATE :

지금, 나는 ProductClass에 대한 __new__를 추가는 전화 메타의 __call__의 책임

class ProductClass(object): 
     __metaclass__ = Meta 
     def __new__(cls, *args): 
      print "ProductClass: __new__ with", args 
      return super(ProductClass, cls).__new__(cls, *args) 
     def __init__(self, *args): 
      print "ProductClass: __init__ with", args 

p = ProductClass(1) 

가 ProductClass의 __new____init__?

답변

4

예 - ProductClass.__init__ (또는 경우에 따라)으로 전화하는 경우 최대 Meta.__call__입니다. 클래스가 호출 될 때, 예를 예를 들어

는 메타 클래스 에서 사용자 지정 __call__() 방법을 정의 할 수 있습니다 사용자 정의 행위 :

documentation이 인용 항상새 인스턴스를 만드는 것은 아닙니다.

해당 페이지는 또한 메타 클래스의 __call__ 다른 클래스의 인스턴스를 반환 할 수 있습니다 시나리오를 언급 (즉,하지 ProductClass 귀하의 예제에서). 이 시나리오에서는 ProductClass.__init__을 자동으로 호출하는 것이 부적절합니다. 당신은 당신이 당신의 __call__ 방법을 정의하고 부모 __call__를 호출하지 않았기 때문에 오버라이드 (override)라고하여 메타 클래스 Meta에 무슨 짓을했는지, 방법을 확장하고 오버라이드 (override) 사이의 OOP에서 차이가 있습니다

+0

을 제가 ProductClass에서 "__new__"을 가지고 있다면? Meta의 "__call__"은 ProductClass의 "__new__"과 "__init__"을 호출합니까? 내 업데이트를 참조하십시오. – Alcott

+0

그리고 분명히 Meta의 "__call__"이 ProductClass의 "__new__"보다 먼저 호출됩니다. – Alcott

+0

문제는'ProductClass .__ new__'와'ProductClass .__ init__'을 호출하기 위해'Meta .__ call__'이 필요하다는 것입니다. 일반적으로'type .__ call__'은 당신을 대신하지만,'Meta .__ call__'을 정의 할 때 그 행동을 덮어 씁니다. 그렇게하지 않으면 실행되지 않습니다. 그래서, 당신은 스스로 __new__와 __init__를 호출하거나, type .__ call __ (cls, * args)와 같은 것을 호출 할 필요가 있습니다. –

6

. 상위 방법 호출하여 당신이 __call__ 방법을 확장해야 할 행동해야합니다 :

class Meta(type): 
    def __call__(cls, *args): 
     print "Meta: __call__ with", args 
     return super(Meta, cls).__call__(*args) 
관련 문제