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

В Python 2 объявление __metaclass__ = type делает объявления, которые в противном случае создавали бы классы старого стиля, вместо этого создавали классы нового стиля. Только классы старого стиля используют декларацию уровня __metaclass__. Классы нового стиля наследуют свой метакласс из своего базового класса (например, object), если только __metaclass__ не предоставляется в качестве переменной класса.

Объявление фактически не используется в коде, который вы указали выше (нет объявлений классов в файле __init__.py), но это может быть так. Я подозреваю, что он был включен как часть некоторого шаблона, который делает код Python 2 более похожим на Python 3 (где все классы всегда новываются).

0

Да, это не имеет никакого эффекта. Вероятно, это просто недоразумение от автора flufl.enum или оставшегося от предыдущего кода.

Объявление «superpackage» __metaclass__ не будет иметь никакого эффекта, потому что нет такой вещи, как суперпаки Python.

Смежные вопросы