>>> class ClassicSpam: # Нет базовых классов
... pass
>>> ClassicSpam.__bases__
()
直接或间接(例如从内置类型继承)的“新”样式类object作为其基类:
>>> class NewSpam(object): # напрямую наследуется от object
... pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int): # косвенно наслудуется от object...
... pass
>>> IntSpam.__bases__
(<type 'int'>,)
>>> IntSpam.__bases__[0].__bases__ # ... потому что int наследуется от object
(<type 'object'>,)
在 Python 3 中,除了在 Python 2 和 3 之间兼容之外,没有理由将. Python 2 中有很多原因。
Python 2.x 的历史
在 Python 2.x(从 2.2 版开始)中,有两种基于存在或不存在
object
作为基类的类样式:“经典”样式类没有
object
作为基类直接或间接(例如从内置类型继承)的“新”样式类
object
作为其基类:毫无疑问,您在编写类时总是希望使用新样式类。这有很多优点,以下是其中的一些:
描述符支持。特别是,描述符可以进行以下构造:
静态方法
__new__
:允许您自定义类的实例化。方法解析顺序(MRO):在尝试确定调用哪个方法时,将按照什么顺序搜索类的基类。
如果您不继承 from
object
,请忘记它。在这里,您可以找到对列表中先前项目的更全面描述,以及“新”样式类的其他优点。新样式类的一个缺点是类本身需要更多内存。但是,除非您要创建很多类对象,否则我怀疑这将是一个问题。
Python 3.x 的历史
在 Python 3 中,一切都得到了简化。只有“新”样式类(简称为类),所以添加时唯一的区别
object
是您需要再输入 8 个字符。它:
与此完全等效(除了他们的名字:-):
和这个:
每个人都有
object
在__bases__
。那么应该怎么做呢?
在 Python 2 中:始终显式继承自
object
.在 Python 3 中:如果您正在编写尝试与 Python 无关的代码,则继承自
object
,即它应该在 Python 2 和 Python 3 中都可以工作。否则,不,这真的没关系,因为 Python 将它粘在一起。来自@DimitrisFasarakisHilliard的答案翻译