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

rmh*_*rmh 15 python

我已经使用Python很长一段时间了,我仍然不确定你为什么要从子类化object.这有什么区别:

class MyClass():
    pass
Run Code Online (Sandbox Code Playgroud)

还有这个:

class MyClass(object):
    pass
Run Code Online (Sandbox Code Playgroud)

据我所知,object是所有类的基类和隐含的子类.你从明确的子类化中获得了什么吗?什么是最"Pythonic"的事情?

kri*_*iss 12

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

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

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

看到这里:新的风格类

你也可以在这里看到SO.


wes*_*cpy 9

同意@kriss,@ Nooctis和@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'>)
Run Code Online (Sandbox Code Playgroud)

请查看@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'>)
Run Code Online (Sandbox Code Playgroud)

底线?如果您使用Python 2进行编码,请尝试尽可能使用新式类.这样,您已经内置了迁移路径,而且新风格的类提供了比经典类更多的功能.(这有点主观,但如果你的[经典]类相对简单,那么你可能不需要做任何事情来让它们在Python 3中工作.)