【问题标题】:Why does MyClass.__class__ return a different value than MyClass().__class__?为什么 MyClass.__class__ 返回的值与 MyClass().__class__ 不同?
【发布时间】:2011-06-04 14:39:21
【问题描述】:

我希望能够调用“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

这是怎么回事?

【问题讨论】:

    标签: python inheritance reflection multiple-inheritance method-resolution-order


    【解决方案1】:

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

    【讨论】:

      【解决方案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/

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2017-06-30
          • 2019-09-23
          • 2018-11-15
          • 2017-07-12
          • 2014-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多