Python类继承对象
是否有任何理由让类声明继承object
?
我刚刚发现了一些代码,我找不到一个很好的理由。
class MyClass(object):
# class code follows...
是否有任何理由让类声明继承object
?
tl; dr:在Python 3中,除了Python 2和3之间的兼容性外,没有理由。 在Python 2中,有很多原因。
Python 2.x故事:
在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
作为第一个参数。 property
:创建用于管理property
的获取,设置和删除的功能。 __slots__
:节省类的内存消耗,并且还可以加快属性访问。 当然,这确实会施加限制。 __new__
静态方法:可让您自定义如何创建新的类实例。
方法解析顺序(MRO):在尝试解析要调用的方法时,将以什么顺序搜索类的基类。
与MRO相关的super
通话。 另见, super()
认为超级。
如果你不从object
继承,忘记这些。 可以在这里找到对前面的要点以及其他“新”风格类的更详尽的描述。
新式课程的一个缺点是课程本身对内存要求更高。 但是,除非你创造了许多类别对象,否则我怀疑这会成为一个问题,而且这是积极的一面。
Python 3.x故事:
在Python 3中,事物被简化了。 只有新式类存在(简称为类),因此添加object
的唯一区别是需要输入8个以上的字符。 这个:
class ClassicSpam:
pass
是完全相同的(除了他们的名字:-):
class NewSpam(object):
pass
并为此:
class Spam():
pass
在他们的__bases__
都有object
。
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
那你该怎么办?
在Python 2中:始终明确地继承object
。 获得福利。
在Python 3:继承object
,如果你正在编写的尝试是Python的不可知,代码是,它需要双方在Python 2和在Python 3工作,否则不,它真的没有什么区别,因为Python中插入它你在幕后。
Python 3.x:
class MyClass(object):
=新风格的类
class MyClass:
=新式类(隐式地从对象继承)
Python 2.x:
class MyClass(object):
=新风格的类
class MyClass:
= OLD-STYLE CLASS
说明:
在Python 3.x中定义基类时,您可以从定义中删除对象。 然而,这可以打开一扇严重难以追踪问题的大门......
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开发人员流下眼泪。
是的,这是一个'新风格'的对象。 这是python2.2中引入的一个功能。
新样式对象与传统对象有不同的对象模型,有些东西不适用于旧样式对象,例如super()
, @property
和描述符。 请参阅本文以获取有关新样式类的详细说明。
SO链接的差异描述:Python中旧风格和新风格类的区别是什么?
链接地址: http://www.djcxy.com/p/9133.html