0

我希望能够调用'person.Person。class ' 并返回 'class person.Person',就像对 person 对象所做的那样:

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

这是 Person 继承树...

class TypeSystem(object):
    __metaclass__ = TypeSystemMeta    

class Model(TypeSystem):
    pass    

class Node(Vertex,Model):
    pass

class Person(Node):
    pass

这里发生了什么?

4

3 回答 3

5

在 Python 中,甚至类也是对象,每个对象都是类的一个实例。Person指的是“类对象”,它是type. 在这种情况下,剧中有一个元类 - 非常混乱的元编程魔法,但如果你想要介绍,请参阅Python 中的元类是什么?. 如果您声明class Foo(object), Foo.__class__ is type(对于不从对象继承的旧式类,情况会有所不同并且更令人困惑)。顺便说一句,这导致了更奇怪的事情,因为这type似乎是它自己的一个例子。

于 2011-06-04T14:56:27.723 回答
2

只需使用对 person.Person 的引用:

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

于 2011-06-04T14:49:13.763 回答
1

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

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

当你重写元类时,你告诉 Python 不要使用它type来创建你的新类。相反,它会将相同的东西传递给自定义类。这允许您覆盖type.

因此,person.Person通过将一些参数传递给您的元类来创建。特别是,它是那个类的一个实例,所以它__class__就是元类!

于 2011-06-04T14:58:06.700 回答