为什么MyClass.\uu class\uuUu返回的值与MyClass()不同。\uu class\uu?

2024-10-01 04:45:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想打电话给你人。人.“返回”类人。人'就像它对person对象所做的那样:

>>> p = person.Person()
>>> p.__class__
<class 'person.Person'>
>>> person.Person.__class__
<class 'perframe.datatype.TypeSystemMeta'>

这是人的遗传树。。。在

^{pr2}$

这是怎么回事?在


Tags: 对象classpersondatatype类人pr2typesystemmetaperframe
3条回答

为了理解你为什么会得到结果,你必须理解元类是什么。要理解这一点,您必须了解如何在Python中创建类。在

当您编写class语句时,解释器会打开一个新的名称空间,执行语句中的代码,并在代码运行后查看名称空间的状态。然后计算出重要的细节(局部变量、类的名称,…)并将其传递给内置类type。因此,type的实例就是我们通常所说的类,因此type是一个“元类”。在

重写元类时,告诉Python不要使用type来创建新类。相反,它将把相同的东西传递给一个自定义类。这允许您覆盖type中的默认值。在

因此,person.Person是通过向元类传递一些参数来创建的。特别是,它是该类的一个实例,因此它的__class__就是元类!在

在Python中,甚至类都是对象,每个对象都是类的实例。Person引用“类对象”,它是type的一个实例。在本例中,有一个元类在play-highly-flusing metaprogramming magic中,但是如果您需要介绍,请参见What is a metaclass in Python?。如果您声明一个class Foo(object)Foo.__class__ is type(对于不从对象继承的旧式类来说,情况有所不同,更加令人困惑)。顺便说一句,这导致更奇怪的是{}似乎是它自己的一个实例。在

只要引用人。人公司名称:

>>> p = person.Person() 
>>> p.__class__ 
<class 'person.Person'> 
>>> person.Person
<class 'person.Person'> 

关于Python类型系统的一个非常有用的资源是Python类型系统2.2+版本的原始草案。在

http://www.python.org/download/releases/2.2/descrintro/

相关问题 更多 >