为什么在Python中需要从object子类化?

15 投票
2 回答
3577 浏览
提问于 2025-04-15 22:02

我已经用Python一段时间了,但还是不太明白为什么要从object这个类去继承。下面这两种写法有什么区别呢:

class MyClass():
    pass

和这个:

class MyClass(object):
    pass

根据我的理解,object是所有类的基础类,继承它是默认的。那从它明确继承有什么好处呢?在Python中,最“Pythonic”的做法是什么呢?

2 个回答

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中,经典类的概念已经不再有效,因为经典类已经被淘汰了。在Python 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做好了准备,而且新式类比经典类有更多的功能。(这有点主观,但如果你的[经典]类比较简单,可能在Python 3中不需要做太多修改就能正常工作。)

12

这是关于Python 2.x中的旧式类和新式类的内容。第二种形式是更新的版本,从Python 2.2开始就有了。对于新的代码,你应该只使用新式类。

在Python 3.x中,你可以随意使用这两种形式,因为新式类是唯一的选择,而且这两种形式实际上是等价的。不过,我认为即使在3.x的代码中,你也应该继续使用MyClass(object)这种形式,至少在Python 3.x被广泛使用之前,这样可以避免让习惯于2.x的读者产生误解。

旧式类和新式类在某些功能上,比如使用super(),表现得非常不同。

你可以在这里查看:新式类

你也可以在这里查看相关内容。

撰写回答