2017-05-08 1 views
2

클래스 개체가 cls입니다. 나는 그 메타 클래스를 알고 싶다. 어떻게해야합니까?Python에서 클래스의 메타 클래스를 결정하는 방법

(.? 내가 부모 클래스를 알고 싶다면, 내가 cls.__mro__ 할 것 메타 클래스를 얻기 위해 이런 일이 있습니까)

+2

그냥'type (cls)' – vaultah

+0

@ 짐 IMO 좋은 대답은 클래스 객체의 유형이 생성 된 메타 클래스 인 이유를 설명합니다. – vaultah

+0

OP의 질문이 실제로 * * * * * * * * *가 아닌 * why *를 요구하는 방식으로 다시 포맷되는 경우. 현재 나는 개인적으로 다시 열어야한다고 생각하지 않습니다. 당신이 아직도 그것이 보증된다고 믿는다면 그렇게해라. –

답변

2

좋아 - 그래서, 클래스의 메타 클래스는 단지 자신의 "유형"이고, type(cls)cls.__class__과 같은 다른 수단으로 주어질 수있다.

파이썬 3.x에서는 메타 클래스를 만들기위한 구문이 클래스 선언문의 명명 된 매개 변수로 전달되기 때문에 더 모호하지 않습니다.

그러나 Python 2.x에서 메타 클래스를 만드는 데 사용되는 구문은 주목할 가치가있는 부작용을 생성합니다.

class A(object): 
    __metaclass__ = MyMeta 

__metaclass__ 특성은 실제 클래스 그 값으로 설정 하시

실제 메타 클래스는 다른하더라도.

def class_pre_decorator(name, bases, namespace): 
    # do something with namespace 
    return type(name, bases, namespace) 

이 파이썬 2와 3 모두의 메타 클래스 선언에서 사용할 수있는 호출입니다 - 그것은 유효합니다

고려. 해결 된 후 두 경우의 실제 메타 클래스는 간단히 type이됩니다. 그러나 Python 2.x에서 cls.__metaclass__은 호출 가능 class_pre_decorator을 가리키고 터프 type(cls)은 올바른 메타 클래스 인 type을 반환합니다. (이 경우 callables를 사용하면 클래스가 더 서브 클래스 화 될 때 agian이 사용되지 않습니다) 온

class A(object): 
    __metaclass__ = class_pre_decorator 

:가 사용 된 것을 실제로 (클래스에 속성을 설정 같은) 다른 힌트를 제공하지 않는 경우 클래스를 인스턴스화하는 데 사용되는 호출을 추측 파이썬 3의 방법은 없습니다

콘솔 :

In [8]: type(A) 
Out[8]: type 

In [9]: A.__metaclass__ 
Out[9]: <unbound method A.class_pre_decorator> 
관련 문제