在 Python 的文档中 __class__
被描述为一个属性。在对象中 type
(元类),__class__
似乎是一种方法。
如果我们这样做:
>>> class Foo:
pass
>>> a = Foo()
>>> a.__class__ == type.__class__(a)
True
所以,我的问题是:
a.__class__
,我们真的在调用方法type.__class__(a)
吗? ? __class__
的原因吗?不是 __dict__
的成员a
的属性? 最佳答案
__class__
是 data descriptor object . Python 核心对象上的许多属性都是作为描述符实现的。您应该将其视为实现细节,仅此而已。__class__
是一个描述符,因为 Python 需要能够验证您分配给它的新值;分配给 __class__
有一定的限制那些需要被尊重的,并且正在制作 __class__
描述符是最有效的方法。
当您尝试访问对象上的属性时,会自动在该类型上找到并调用描述符对象。 instance.__class__
将找到并执行 __class__
类上的描述符(通过搜索继承图中的所有类),通常以 object.__dict__['__class__'].__get__(instance, type(instance))
结尾(其中 object
通常是在 __class__
序列中找到 type(instance).__mro__
属性的第一个类);发生这种情况是因为 Python 将始终使用类型的 __getattribute__
方法来查找属性,该方法知道如何处理在类和基类上找到的描述符,以及查看 object.__dict__
属性。所以他们不生活在对象 __dict__
本身,它们按照设计生活在对象类型上。
现在,类对象也是可调用对象。这就是您创建实例的方式;对于给定的类 Foo
,你通过调用它来创建一个实例,所以 Foo()
. instance.__class__
只是类对象的引用,就像class_obj = Foo
将创建对类的引用。调用类对象会生成一个新实例,无论您用来获取它的任何引用。
最后,type.__class__
只是对 type()
的引用本身:
>>> type.__class__ is type
True
>>> type.__class__
<class 'type'>
>>> type(type)
<class 'type'>
那是因为type
它是自己的类型。 Python 类型系统的父子关系必须停在某处,type
是那个点。在您的示例中,
a.__class__
是对 Foo
的引用类(class)。和 type.__class__
与 type
是同一个对象,所以你基本上是这样做的:Foo == type(a)
确实如此,a
的类型是 Foo
.
关于Python __class__(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066220/