为什么有必要从Python中的对象继承子类?

时间:2010-04-26 16:43:11

标签: python

我已经使用Python很长一段时间了,我仍然不确定为什么要从object继承。有什么区别:

class MyClass():
    pass

而且:

class MyClass(object):
    pass

据我所知,object是所有类的基类,暗示了子类。你从明确的子类化中获得了什么吗?什么是最“Pythonic”的事情?

2 个答案:

答案 0 :(得分:12)

这是python 2.x中的oldstyle和new style类。第二种形式是最新版本,存在于python 2.2及更高版本。对于新代码,您应该只使用新的样式类。

在Python 3.x中,您可以再次使用两种形式,因为新样式是唯一剩下的形式,两种形式都是真正等效的。但是我相信你应该继续使用MyClass(object)形式,甚至至少使用3.x代码,直到python 3.x被广泛采用,以避免与用于2.x的代码的潜在读者产生任何误解。

旧样式和新样式类之间的行为与使用super()等某些功能有很大不同。

见这里:New Style classes

您还可以在SO上看到here

答案 1 :(得分:9)

同意@ kriss,@ Noctis和@Carson,加上我的更多颜色:

class X: passclass 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中工作。)