2015-10-26 4 views

ответ

2

тест, если объект является подклассом type:

issubclass(MetaClass, type) 

Это возвращает True для всех метаклассами, в том числе самого type.

Демо:

>>> class Meta(type): pass 
... 
>>> class Foo(object): pass 
... 
>>> issubclass(Meta, type) 
True 
>>> issubclass(Foo, type) 
False 
2

Большинство Метаклассы 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'> 
+0

Действительно ли это код python 3? Я думал, что python 3 избавился от аргумента метакласса в конструкторе. –

+0

@BenHoff: да. Это код Python 3. Python 3 использует 'metaclass' в выражении' class' (это не конструктор). Python 2 использует атрибут '__metaclass__' (для класса или модуля). – jfs

+0

Это не совсем ответ, но поднимает важный момент: что вы * указываете *, поскольку метакласс не обязательно является классом; он просто должен быть вызываемым, что * возвращает * объект с тем же API, что и объект 'type'. – chepner