根据 here :
我用这个尝试了 __mro__
属性:
class a:
def __init__(self):
self.testValue = 123
然后我输入:
type(a).__mro__
(<type 'classobj'>, <type 'object'>)
什么是
classobj
?它与 object
有什么区别?添加 1
也许我今天有点头晕......但我猜
classobj
只是意味着 class a
,对吧?所以上面的输出只是说方法解析顺序是首先 class a
然后 type object
。 最佳答案
首先请注意,在 Python 2.x 中,语法:
class XXX:
# whatever
将产生一个“旧式”类。您可以在 the fine manual 、 this doc page 和 Python wiki 中阅读有关“旧式”与“新式”类的更多信息
然后,在您的情况下,您不是要求类
a
的 mro,而是要求类 a
(这是 type(a)
返回的)类型的 mro,在本例中是 classobj
类型。但是除非您必须维护或处理遗留代码,否则您不必担心旧式类、classobj
等。作为记录,Python 的大多数标准 OO 功能(包括 super()
、描述符等)在旧式类上无法正常工作,所以不要使用它们,也不要试图理解与"new"有关的东西(好吧,现在大约 10 岁了)使用旧式类的对象模型......TL; DR:你想要:
class A(object):
# this is a new-style class
错误的。
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'>)
>>>
关于python - <type 'classobj' > 和 <type 'object' > 的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40171871/