我希望能够调用'person.Person.class‘并返回“类person”,就像对person对象的调用一样:
>>> p = person.Person()
>>> p.__class__
<class 'person.Person'>
>>> person.Person.__class__
<class 'perframe.datatype.TypeSystemMeta'>
这是个人继承树..。
class TypeSystem(object):
__metaclass__ = TypeSystemMeta
class Model(TypeSystem):
pass
class Node(Vertex,Model):
pass
class Person(Node):
pass
这里发生了什么事?
发布于 2011-06-04 14:56:27
在Python中,甚至类都是对象,每个对象都是类的实例。Person
引用“类对象”,它是type
的一个实例。在这种情况下,游戏中有一个元类--非常令人困惑的元编程魔术,但是如果您想要介绍一下,请参阅What is a metaclass in Python?。如果您声明了一个class Foo(object)
,那么Foo.__class__ is type
(对于不从对象继承的旧风格的类来说,情况是不同的,而且更令人困惑)。顺便说一句,这导致了更多的怪异,因为type
似乎是自身的一个实例。
发布于 2011-06-04 14:49:13
只需使用对person.Person的引用:
>>> p = person.Person()
>>> p.__class__
<class 'person.Person'>
>>> person.Person
<class 'person.Person'>
Python类型系统的一个非常有用的资源是2.2+版本的的原始草案。
http://www.python.org/download/releases/2.2/descrintro/
发布于 2011-06-04 14:58:06
要理解你为什么会得到这样的结果,你必须了解元类是什么。要理解这一点,您必须了解类是如何用Python创建的。
编写class
语句时,解释器将打开一个新的命名空间,执行语句中的代码,并在该代码运行后查看名称空间的状态。然后计算出重要的细节(局部变量、类的名称、.)并将其传递给内置类type
。因此,type
的实例就是我们通常所称的类,因此type
是一个“元类”。
当您重写元类时,您告诉Python不要使用type
来创建新类。相反,它将向自定义类传递相同的内容。这允许您覆盖type
中的默认值。
因此,person.Person
是通过向元类传递一些参数来创建的。特别是,它是该类的一个实例,因此它的__class__
是元类!
https://stackoverflow.com/questions/6237356
复制相似问题