我已经使用Python很长一段时间了,我仍然不确定为什么要从object
继承。有什么区别:
class MyClass():
pass
而且:
class MyClass(object):
pass
据我所知,object
是所有类的基类,暗示了子类。你从明确的子类化中获得了什么吗?什么是最“Pythonic”的事情?
答案 0 :(得分:12)
这是python 2.x中的oldstyle和new style类。第二种形式是最新版本,存在于python 2.2及更高版本。对于新代码,您应该只使用新的样式类。
在Python 3.x中,您可以再次使用两种形式,因为新样式是唯一剩下的形式,两种形式都是真正等效的。但是我相信你应该继续使用MyClass(object)
形式,甚至至少使用3.x代码,直到python 3.x被广泛采用,以避免与用于2.x的代码的潜在读者产生任何误解。
旧样式和新样式类之间的行为与使用super()等某些功能有很大不同。
您还可以在SO上看到here。
答案 1 :(得分:9)
同意@ kriss,@ Noctis和@Carson,加上我的更多颜色:
class X: pass
和class X(): pass
是经典类的同义词
class X(object): pass
适用于新式类,您可以在此处看到:
>>> class X:pass
...
>>> class Y(): pass
...
>>> class Z(object): pass
...
>>>
>>> type(X), type(Y), type(Z)
(<type 'classobj'>, <type 'classobj'>, <type 'type'>)
查看@kriss提供的参考资料,了解差异的更多细节。 Python 3中无效的是经典类的概念......原因是因为经典类已被弃用。这三个习语只在任何3.x中创建新风格的类:
>>> class X:pass
...
>>> class Y(): pass
...
>>> class Z(object): pass
...
>>>
>>> type(X), type(Y), type(Z)
(<class 'type'>, <class 'type'>, <class 'type'>)
底线?如果您使用Python 2进行编码,请尝试尽可能使用新式类。这样,您已经内置了迁移路径,而且新风格的类提供了比经典类更多的功能。 (这有点主观,但如果你的[经典]类相对简单,那么你可能不需要做任何事情来让它们在Python 3中工作。)