Python类inheritance对象

类声明是否有任何理由inheritanceobject

我刚刚发现了一些代码,我找不到一个很好的理由。

 class MyClass(object): # class code follows... 

类声明是否有任何理由inheritanceobject

在Python 3中,除了Python 2和3之间的兼容性之外, 没有 。 在Python 2中, 是的


Python 2.x的故事:

在Python 2.x(从2.2开始)中,有两种types的类,这取决于是否存在内置types作为基类:

  1. “经典”风格类:它们没有内置types作为基类:

     >>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ () 
  2. “新”风格的类:它们有一个内置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'>,) 

毫无疑问,在写课程时,你总是会想要去上新式的课程。 这样做的好处很多,列出其中的一些:

  • 支持描述符 。 具体来说,下面的构造是可能的描述符:

    1. classmethod :将类作为隐式参数而不是实例接收的方法。
    2. staticmethod :一种不接收隐含的参数self作为第一个参数的方法。
    3. 具有property :创build用于pipe理property的获取,设置和删除的function。
    4. __slots__ :节省了一个类的内存消耗,也导致了更快的属性访问。 当然,这确实会施加限制 。
  • __new__静态方法:让您自定义如何创build新的类实例。

  • 方法parsing顺序(MRO) :在尝试parsing调用哪个方法时,将以什么顺序查找类的基类。

  • 有关MRO, super电话 。 另见, super()认为超级。

如果你不从objectinheritance,忘记这些。 在这里可以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了一个新风格的类 。