5

object在 Python 2.x 中,所有新样式的类都隐式或显式继承自。然后看看这个:

>>> 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

为什么是bothAB的实例object

如果B是 的一个实例object,那么type(B)不会是classobj,对吗?

4

2 回答 2

5

关于元类,您可以在此处阅读:http: //docs.python.org/reference/datamodel.html#customizing-class-creation。通常,元类旨在与新样式类一起使用。当你写:

class M(type):
    pass

你使用:

class C:
    __metaclass__ = M

您将创建一个新样式对象,因为定义 M 的方式(默认实现用于type创建新样式类)。您始终可以实现自己的元类,该元类将使用types.ClassType.

于 2012-05-08T08:43:56.640 回答
1

关于插槽,您可以在这里阅读http://docs.python.org/release/2.5.2/ref/slots.html,一个片段:

默认情况下,新旧类的实例都有一个用于属性存储的字典。

对于您可以添加的新型类__slots__,将不会创建每个对象的字典。

于 2012-05-08T08:46:12.253 回答