【发布时间】:2018-04-26 22:35:26
【问题描述】:
我试图对 Python 中的元类有一些直觉。我已经尝试过 Python2.7 和 Python3.5。在 Python3.5 中,我发现我们定义的每个类都是 <class 'type'> 类型,无论我们是否显式继承。但如果不是从 type 继承,我们就不能将该类用作另一个类的元类。
>>> class foo:
pass
>>> class Metafoo(type):
pass
>>> foo
<class '__main__.foo'>
>>> Metafoo
<class '__main__.Metafoo'>
>>> type(foo)
<class 'type'>
>>> type(Metafoo)
<class 'type'>
>>>
>>> class foocls1(metaclass=foo):
pass
执行上述操作会出现以下错误:
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
class foocls1(metaclass=foo):
TypeError: object() takes no parameters
但在使用 Metafoo 作为新类的元类时,情况并非如此
>>> class foocls3(metaclass=Metafoo):
pass
>>> foocls3
<class '__main__.foocls3'>
>>> type(foocls3)
<class '__main__.Metafoo'>
如果我们想将一个类用作其他类中的元类,任何人都可以解释为什么我们需要显式继承这种情况。
【问题讨论】:
-
每个类都是
type的实例,但它们并不是type的所有子类。
标签: python python-3.x oop metaclass