根据here:
该类型的
__mro__
属性列出了方法分辨率搜索getattr()
和super()
使用的订单。该属性是动态的 每当更新继承层次结构时都可以更改。
我尝试使用__mro__
属性:
class a:
def __init__(self):
self.testValue = 123
然后我打字:
type(a).__mro__
(<type 'classobj'>, <type 'object'>)
classobj
是什么?它与object
的区别是什么?
今天也许我有点头晕...但我想classobj
只是意味着class a
,对吧?所以上面的输出只是说方法解析顺序是class a
然后是type object
。
答案 0 :(得分:4)
首先请注意,在Python 2.x中,语法为:
class XXX:
# whatever
将产生一个“旧式”课程。您可以在the fine manual,this doc page和Python 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'>)
>>>