根据 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 manualthis doc pagePython 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/

10-12 00:24