Чтобы поймать ваш взгляд:
Я думаю, что документация может быть неправильной!
Согласно документации Python 2.7.12, 3.4.3. Настройка создания класса:
__metaclass__
Эта переменная может быть любой вызываемой, принимающей аргументы для имени, базы и словаря. При создании класса вместо встроенногоtype()
используется вызываемый объект.Новое в версии 2.2.
Однако эта статья а> утверждает:
В: Ух ты! Могу ли я использовать объект любого типа в качестве
__metaclass__
?A: Нет. Это должен быть подкласс типа базового объекта. ...
Итак, я провел эксперимент самостоятельно:
class metacls(list): # <--- subclassing list, rather than type
def __new__(mcs, name, bases, dict):
dict['foo'] = 'metacls was here'
return type.__new__(mcs, name, bases, dict)
class cls(object):
__metaclass__ = metacls
pass
Это дает мне:
Traceback (most recent call last):
File "test.py", line 6, in <module>
class cls(object):
File "test.py", line 4, in __new__
return type.__new__(mcs, name, bases, dict)
TypeError: Error when calling the metaclass bases
type.__new__(metacls): metacls is not a subtype of type
Так документ действительно неправильный?