문제

나는 파이썬에서 메타 클래스에 대해 배우려고 노력했습니다. 주요 아이디어를 얻지 만 메커니즘을 활성화 할 수는 없습니다. 내가 이해하는 것처럼, 당신은 m을 설정하여 클래스 k를 구성 할 때 m을 메타 클래스로 지정할 수 있습니다. __metaclass__ 글로벌 또는 클래스 수준에서 M에. 이것을 테스트하기 위해 다음 프로그램을 작성했습니다.

p = print

class M(type):
    def __init__(*args):
        type.__init__(*args)
        print("The rain in Spain")

p(1)
class ClassMeta:
    __metaclass__ = M

p(2)
__metaclass__ = M
class GlobalMeta: pass

p(3)
M('NotMeta2', (), {})

p(4)

그러나 실행하면 다음과 같은 출력을 얻습니다.

C:\Documents and Settings\Daniel Wong\Desktop>python --version
Python 3.0.1

C:\Documents and Settings\Daniel Wong\Desktop>python meta.py
1
2
3
The rain in Spain
4

1과 2 후에 "스페인의 비"를보아야합니까? 여기서 무슨 일이야?

도움이 되었습니까?

해결책

Python 3 (사용중인) Metaclasses는 클래스 정의의 키워드 매개 변수로 지정됩니다.

class ClassMeta(metaclass=M):
  pass

지정 a __metaclass__ 클래스 속성 또는 글로벌 변수는 Python 2.X의 오래된 구문이며 더 이상 지원되지 않습니다. 또한보십시오 "Python 3의 새로운 기능" 그리고 PEP 2115.

다른 팁

이것은 Python 2.6 (및 이전)에서 예상되는대로 작동하지만 3.0 메타 클래스에서 다르게 지정됩니다.

class ArgMeta(metaclass=M): ...

메타 클라스의 구문은 있습니다 변경 파이썬 3.0. 그만큼 __metaclass__ 속성은 더 이상 클래스 나 모듈 레벨에서 특별하지 않습니다. 당신이하려는 일을하려면 지정해야합니다. metaclass 키워드 인수로 class 성명:

p = print

class M(type):
    def __init__(*args):
        type.__init__(*args)
        print("The rain in Spain")

p(1)
class ClassMeta(metaclass=M): pass

수확량 :

1
The rain in Spain

예상대로.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top