为什么Python类继承对象?
为什么以下类声明继承自 ?object
class MyClass(object):
...
为什么以下类声明继承自 ?object
class MyClass(object):
...
类声明有什么理由从 中继承?
object
在Python 3中,除了Python 2和3之间的兼容性,没有理由。在Python 2中,原因有很多。
在Python 2.x(从2.2开始)中,有两种类样式,具体取决于作为基类的存在与否:object
“经典”样式类:它们没有作为基类:object
>>> class ClassicSpam: # no base class
... pass
>>> ClassicSpam.__bases__
()
“新”样式类:它们直接或间接地(例如从内置类型继承)作为基类:object
>>> class NewSpam(object): # directly inherit from object
... pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int): # indirectly inherit from object...
... pass
>>> IntSpam.__bases__
(<type 'int'>,)
>>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object
(<type 'object'>,)
毫无疑问,在编写课程时,您总是希望选择新式课程。这样做的好处很多,列出其中的一些:
支持描述符。具体而言,使用描述符可以实现以下构造:
classmethod
:一种将类作为隐式参数而不是实例接收的方法。staticmethod
:一种不接收隐式参数作为第一个参数的方法。self
属性的属性
:创建用于管理属性的获取、设置和删除的函数。__slots__
:节省类的内存消耗,并加快属性访问速度。当然,它确实施加了限制。__new__
静态方法:允许您自定义新类实例的创建方式。
方法解析顺序 (MRO):在尝试解析要调用的方法时,将以什么顺序搜索类的基类。
与MRO相关,超级
呼叫。另请参阅,超级()
被认为是超级。
如果您没有继承自 ,请忘记这些。可以在此处找到对以前的要点以及“新”样式类的其他好处的更详尽的描述。object
新式类的缺点之一是类本身对内存的要求更高。但是,除非你正在创建许多类对象,否则我怀疑这将是一个问题,它是在积极海洋中的消极沉没。
在Python 3中,事情被简化了。只有新样式的类存在(简称为类),因此,添加的唯一区别是要求您再键入8个字符。这:object
class ClassicSpam:
pass
是完全等价的(除了他们的名字:-)对此:
class NewSpam(object):
pass
对此:
class Spam():
pass
所有人都在他们的.object
__bases__
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
在Python 2中:始终显式地从对象
继承。获得福利。
在Python 3中:如果你正在编写试图与Python无关的代码,也就是说,它需要在Python 2和Python 3中同时工作。否则不要,它真的没有什么区别,因为Python会在幕后为你插入它。object
蟒蛇 3
class MyClass(object):
= 新式类class MyClass:
= 新样式类(隐式继承自object
)Python 2
class MyClass(object):
= 新式类class MyClass:
= 老式舱
说明:
在Python 3.x中定义基类时,您可以从定义中删除。但是,这可能会为一个严重难以跟踪的问题打开大门......object
Python在Python 2.2中引入了新式类,到现在为止,旧式类确实很旧。旧式类的讨论隐藏在2.x文档中,在3.x文档中不存在。
问题是,Python 2.x中旧式类的语法与Python 3.x中新式类的替代语法相同。Python 2.x仍然被非常广泛使用(例如GAE,Web2Py),任何代码(或编码器)在不知不觉中将3.x风格的类定义引入2.x代码,最终都会得到一些严重过时的基本对象。而且,由于旧式课程不在任何人的雷达上,他们可能不知道是什么击中了他们。
因此,只需将其拼写出来,并节省一些2.x开发人员的眼泪。