2013-09-01 2 views
6

Python (2 만?)은 __metaclass__ 변수의 값을보고 클래스 정의에서 type 개체를 만드는 방법을 결정합니다. It is possible to define __metaclass__ at the module or package level이 경우 해당 모듈의 모든 후속 클래스 정의에 적용됩니다.`__metaclass__ = type`의 목적은 무엇입니까?

그러나, 나는 발생한에서 다음 flufl.enum 패키지의 __init__.py :

__metaclass__ = type 

정의되지 않은 __metaclass__ 경우 기본 메타 클래스는 type이기 때문에,이 아무런 영향을 미치지 않을 것이다? (__metaclass__이 더 높은 범위에서 할당 된 경우이 할당은 기본값으로 되돌아 가지 만 그러한 할당은 없습니다.) 그 목적은 무엇입니까?

답변

9

파이썬 2에서 선언문 __metaclass__ = type은 이전 스타일의 클래스를 만드는 선언은 대신 새로운 스타일의 클래스를 만듭니다. 구식 클래스 만 모듈 수준 __metaclass__ 선언을 사용합니다. 새 스타일 클래스는 __metaclass__이 클래스 변수로 제공되지 않는 한 기본 클래스 (예 : object)에서 메타 클래스를 상속합니다.

위의 코드에 실제로 선언문을 사용하지 않았으므로 (__init__.py 파일에는 클래스 선언이 없습니다), 그럴 수도 있습니다. 파이썬 2 코드가 파이썬 3 (모든 클래스가 항상 새로운 스타일 인)처럼 작동하도록하는 보일러 플레이트의 일부로 포함 된 것으로 의심된다.

0

예, 아무런 효과가 없습니다. 그것은 아마도 flufl.enum의 저자, ​​또는 이전 코드에서 남은 것에서 오해 일뿐입니다.

"슈퍼 패키지"__metaclass__ 선언은 아무런 효과가 없습니다. 파이썬 슈퍼 패키지와 같은 것이 없기 때문입니다.

관련 문제