Большинство Метаклассы type
подклассы (issubclass(metaklass, type)
) но не все:
>>> def logging_meta(name, bases, namespace, **kwd):
... print(name, bases, namespace, kwds)
... return type(name, bases, namespace, **kwds)
...
>>> class C(metaclass=logging_meta):
... a = 1
...
C() {'__module__': '__main__', '__qualname__': 'C', 'a': 1} {}
>>> issubclass(logging_meta, type)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
т.е., ответ «любой вызываемым например, класс с методом __call__()
который принимает те же аргументы, что и type()
, и возвращает объект класса, который будет делать: «
>>> class C(metaclass=lambda *a: lambda *a: None): pass
...
>>> C()
>>> type(C)
<class 'function'>
Действительно ли это код python 3? Я думал, что python 3 избавился от аргумента метакласса в конструкторе. –
@BenHoff: да. Это код Python 3. Python 3 использует 'metaclass' в выражении' class' (это не конструктор). Python 2 использует атрибут '__metaclass__' (для класса или модуля). – jfs
Это не совсем ответ, но поднимает важный момент: что вы * указываете *, поскольку метакласс не обязательно является классом; он просто должен быть вызываемым, что * возвращает * объект с тем же API, что и объект 'type'. – chepner