__metaclass___는 파이썬에서 메타 클라스를 사용하지 않아야합니까?
-
03-07-2019 - |
문제
나는 파이썬에서 메타 클래스에 대해 배우려고 노력했습니다. 주요 아이디어를 얻지 만 메커니즘을 활성화 할 수는 없습니다. 내가 이해하는 것처럼, 당신은 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
예상대로.
제휴하지 않습니다 StackOverflow