Python类inheritance对象
类声明是否有任何理由inheritanceobject
?
我刚刚发现了一些代码,我找不到一个很好的理由。
class MyClass(object): # class code follows...
类声明是否有任何理由inheritance
object
?
在Python 3中,除了Python 2和3之间的兼容性之外, 没有 。 在Python 2中, 是的 。
Python 2.x的故事:
在Python 2.x(从2.2开始)中,有两种types的类,这取决于是否存在内置types作为基类:
-
“经典”风格类:它们没有内置types作为基类:
>>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ ()
-
“新”风格的类:它们有一个内置types作为基类,它直接或间接地将
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
:创build用于pipe理property
的获取,设置和删除的function。 -
__slots__
:节省了一个类的内存消耗,也导致了更快的属性访问。 当然,这确实会施加限制 。
-
-
__new__
静态方法:让您自定义如何创build新的类实例。 -
方法parsing顺序(MRO) :在尝试parsing调用哪个方法时,将以什么顺序查找类的基类。
-
有关MRO,
super
电话 。 另见,super()
认为超级。
如果你不从object
inheritance,忘记这些。 在这里可以find以前的要点以及“新”风格类的其他特性的更详尽的描述。
新式课程的缺点之一是课程本身对内存要求更高。 除非你创造了许多课堂对象,否则我怀疑这将是一个问题,这是积极的一面。
Python 3.x的故事:
在Python 3中,事物被简化了。 只有新式的类存在(简称为类),所以添加object
的唯一区别是要求input8个以上的字符。 这个:
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中: 始终明确地inheritanceobject
。 获得福利。
在Python 3中:如果您正在编写试图成为Python不可知的代码,那么它就需要inheritanceobject
,也就是说,它需要在Python 2和Python 3中都可以工作。否则,不要这样做。
Python 3.x:
class MyClass(object):
= new-style class
class MyClass:
= new-style class(隐式inheritance对象)
Python 2.x:
class MyClass(object):
= new-style class
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开发人员stream下眼泪。
是的,这是一个“新风格”的对象。 这是python2.2中引入的一个function。
新样式对象与传统对象有不同的对象模型,有些东西不适用于旧样式对象,例如super()
, @property
和descriptor。 请参阅这篇文章 ,了解新风格类的一个很好的描述。
SO链接的差异描述: Python中的旧风格和新风格类有什么区别?
从Python学习的艰辛之路 :
Python的一个类的原始演绎以许多严肃的方式被打破。 当这个错误被确认的时候已经太晚了,他们不得不支持它。 为了解决这个问题,他们需要一些“新class级”的风格,让“老class子”继续工作,但是你可以使用新的更正确的版本。
他们决定,他们会用一个“物体”这个词来形容你是inheritance而成为一个阶级的“阶级”。 这是令人困惑的,但是一个类从名为“object”的类inheritance来创build一个类,但它不是一个真正的类对象,但是不要忘记从对象inheritance。
也只是为了让大家知道,新风格类和旧风格类之间的区别在于,新风格类总是从对象类或其他任何类inheritance而来。
class NewStyle(object): pass
另一个例子是:
class AnotherExampleOfNewStyle(NewStyle): pass
一个旧式的基类看起来像这样:
class OldStyle(): pass
而一个老式的小孩课堂是这样的:
class OldStyleSubclass(OldStyle): pass
你可以看到一个旧式的基类不能从任何其他类inheritance,然而,旧式类当然可以相互inheritance。 从对象inheritance保证每个Python类都具有某些function。 Python 2.2引入了新的风格类
是的,这是历史的 。 没有老式的课程。
如果你在一个旧式对象上使用type()
,你只需要“实例”。 在一个新的对象,你得到它的类
类创build语句的语法:
class <ClassName>(superclass): #code follows
如果没有任何其他的超类,你特别想要inheritance, superclass
应该总是object
,这是Python中所有类的根。
object
在技术上是Python中“新风格”类的根源。 但是,今天的新式课程就像是唯一的课堂风格一样好。
但是,如果您在创build类时没有明确使用单词object
,那么正如其他人所提到的那样,Python 3.x隐式地inheritance了object
超类。 但我猜明确总是比隐式(地狱)好,
参考
这创build了一个新风格的类 。