[英]Old-style classes, new-style classes and metaclasses
在Python 2.x中,所有新式类都隐式或显式地从object
继承。 然后看这个:
>>> class M(type):
... pass
...
>>> class A:
... __metaclass__ = M
...
>>> class B:
... pass
...
>>> a = A()
>>> b = B()
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>
这是否意味着A
是一种新型类? 但是A
仍然不会从object
继承,对吗?
>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>
好吧, B
是经典班,不是吗?
>>> isinstance(A, object)
True
>>> isinstance(B, object)
True
为什么object
A
和B
实例都是实例?
如果B
是object
的实例,则type(B)
不会是classobj
,对吧?
关于元类,您可以在这里阅读: http : //docs.python.org/reference/datamodel.html#customizing-class-creation 。 通常,元类旨在与新样式类一起使用。 当你写:
class M(type):
pass
而您使用:
class C:
__metaclass__ = M
您将创建一个新样式对象,因为定义了M的方式(默认实现使用type
来创建新样式类)。 您始终可以实现自己的元类,该元类将使用types.ClassType
创建老式的类。
关于插槽,您可以在此处http://docs.python.org/release/2.5.2/ref/slots.html中阅读片段:
默认情况下,新旧类的实例都具有用于属性存储的字典。
对于新型类,您可以添加__slots__
,然后将不会创建每个对象的字典。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.