<type'classobj'=“”>,<type'object'=“”>之间的区别?

时间:2016-10-21 08:30:55

标签: python python-2.7

根据here

  

该类型的__mro__属性列出了方法分辨率搜索   getattr()super()使用的订单。该属性是动态的   每当更新继承层次结构时都可以更改。

我尝试使用__mro__属性:

class a:
    def __init__(self):
        self.testValue = 123

然后我打字:

type(a).__mro__
(<type 'classobj'>, <type 'object'>)

classobj是什么?它与object的区别是什么?

ADD 1

今天也许我有点头晕...但我想classobj只是意味着class a,对吧?所以上面的输出只是说方法解析顺序是class a然后是type object

1 个答案:

答案 0 :(得分:4)

首先请注意,在Python 2.x中,语法为:

class XXX:
    # whatever

将产生一个“旧式”课程。您可以在the fine manualthis doc pagePython wiki

中阅读有关“旧式”与“新式”课程的更多信息

然后,在你的情况下,你不是要求类a的mro,而是要求类a的类型的mro(这是type(a)返回的),在这种情况下是classobj类型。但是你不应该担心旧式的类classobj等,除非你必须维护或处理遗留代码。为了记录,Python的大多数标准OO功能(包括super(),描述符等)在旧式类上都不能正常工作,所以不要使用它们,也不要试图理解与之相关的东西。 “新”(好吧,现在大约10岁)使用旧式类的对象模型......

TL; DR:你想:

class A(object):
    # this is a new-style class
  

今天也许我有点头晕......但是我觉得classobj只是意味着a级,对吧?

错误。 classobj是一种特殊类型,用作旧式类的元类。元类是类的类(因为类是对象,它们是类的实例)。

  

所以上面的输出只是说方法解析顺序是第一类然后是类型对象。

不,它表示classobj类型的mro首先是classobj,然后是object

如果您想要类a的mro,那么只需要它 - 然后您就会发现为什么不应该评估旧式类的新风格功能:

>>> class a: pass
... 
>>> a.__mro__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class a has no attribute '__mro__'

现在与新式课程进行比较:

>>> class Foo(object): pass
... 
>>> Foo.__mro__
(<class '__main__.Foo'>, <type 'object'>)
>>>