2013-09-01 27 views
6

Python (tylko 2?) Sprawdza wartość zmiennej __metaclass__, aby określić sposób utworzenia obiektu type z definicji klasy. It is possible to define __metaclass__ at the module or package level, w którym to przypadku ma zastosowanie do wszystkich kolejnych definicji klas w tym module. NatknąłemJaki jest cel `__metaclass__ = type`?

Jednak podążając pakiet na __init__.pyflufl.enum:

__metaclass__ = type 

Ponieważ domyślnym metaklasa jeśli __metaclass__ nie jest zdefiniowana jest type, nie będzie to miało żadnego wpływu? (To przypisanie powróciłoby do domyślnego, gdyby __metaclass__ zostało przypisane do wyższego zakresu, ale nie widzę takiego przypisania.) Jaki jest jego cel?

Odpowiedz

9

W języku Python 2 deklaracja __metaclass__ = type powoduje, że deklaracje, które w przeciwnym razie tworzyłyby klasy w starym stylu, tworzyłyby zamiast tego klasy w nowym stylu. Tylko klasy w starym stylu używają deklaracji poziomu modułu __metaclass__. Klasy w nowym stylu dziedziczą metaclass z ich klasy bazowej (na przykład object), chyba że podano __metaclass__ jako zmienną klasy.

Deklaracja nie jest faktycznie używana w kodzie powiązanym z powyższym (nie ma deklaracji klasy w pliku __init__.py), ale może być. Podejrzewam, że został on włączony jako część zestawu znaków, który sprawia, że ​​kod Pythona 2 działa bardziej jak Python 3 (gdzie wszystkie klasy są zawsze w nowym stylu).

0

Tak, nie ma żadnego efektu. To prawdopodobnie tylko nieporozumienie z autora flufl.enum lub pozostałości po poprzednim kodzie.

Deklaracja "superpackage" __metaclass__ nie przyniosłaby skutku, ponieważ nie ma czegoś takiego jak superpakiety Python.