python类继承对象

Python class inherits object

类声明从object继承有什么原因吗?

我刚刚找到了一些代码,但我找不到原因。

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


Python 3 .x:class MyClass(object):=新型班级class MyClass:=new-style类(隐式继承自对象)

Python 2 .x:class MyClass(object):=新型班级class MyClass:=旧式班级

说明:

在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开发人员的眼泪。


Is there any reason for a class declaration to inherit from object?

铊;博士:在Python 3分之间的相容性,从Python的2和3,没有原因的。在Python中,很多的原因。 </P > Python的2。x的故事:

在Python的2。x(从2.2起)有两页的风格研究班depending对在场的或缺乏object大学作为一个基本类: </P >

  • "经典"的新型模式:他们没有object作为一个基本类: </P >

    1
    2
    3
    4
    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
  • "新"的教学风格:他们已经,或直接到indirectly(e.g inherit从一个嵌入式型),object作为一个基本类: </P >

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> 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'>,)
  • 没有一个怀疑,当写作(一级你会永远想去设计的新型模式。perks所做的即是numerous,一些他们的列表: </P >

    • 支持descriptors。。。。。。。具体来说,下面的是建筑的机制可能与descriptors: </P >

    • classmethod:一种方法是receives之类的,作为一argument隐去的实例。
    • 一种方法是:staticmethod并不减少的隐式argument self作为第一argument。。。。。。。
    • 置业与property:create函数的设计管理中去,和deleting设置一个属性。
    • __slots__:saves存储器consumptions A类和属性的结果也在更快的接入方式。当然,它也不impose的局限性。
    • __new__静态法:参见自定义你的新类的instances是如何创造的。 </P >

    • 方法的分辨率(阶)(私营):在什么阶的基地班一级将是searched当试图做出的resolve这方法呼叫。 </P >

    • 相关的)(私营,super电话。也看到,被视super()超。 </P >

    如果你不inherit从object,忘记这些。一个更exhaustive描述的以前的子弹点沿与其他perks大学的"新"式的类可以发现在这里。 </P >

    一部downsides大学新型教学这是在类本身是demanding更多的存储器。除非你是创造了很多的类的对象,不过,我怀疑这将是我的问题和它的一个负sinking在海洋positives。。。。。。。 </P > Python 3.x的故事:

    在Python 3,事情是简化。只读的新型类exist(提到的plainly AS类)所以,唯一的差分细胞增object是你的requiring型8在更多的人物。本: </P >

    1
    2
    class ClassicSpam:
        pass

    是完全等效的(分离的从他们的名字:-)到这个: </P >

    1
    2
    class NewSpam(object):
         pass

    及到这个: </P >

    1
    2
    class Spam():
        pass

    全有object他们__bases__。。。。。。。 </P >

    1
    2
    >>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
    [True, True, True]

    所以,如果你做的是什么?

    在Python 2:总的inherit从objectexplicitly。。。。。。。得到的perks。。。。。。。 </P >

    在Python中objectinherit 3:如果你是写作的代码,tries是Python的agnostic,这是需要的,它的工作都在Python Python在2和3。否则,不,它真的很好,使得差分从Python inserts它为你后面的scenes。。。。。。。 </P >


    是的,这是一个"新样式"对象。这是python2.2中介绍的一个特性。

    新样式对象与经典对象具有不同的对象模型,有些对象无法与旧样式对象(例如,super()@property和描述符)一起正常工作。有关新样式类的详细描述,请参阅本文。

    那么链接来描述这些区别:在Python中,旧样式类和新样式类之间的区别是什么?


    历史从学习Python的艰难之路:

    Python's original rendition of a class was broken in many serious
    ways. By the time this fault was recognized it was already too late,
    and they had to support it. In order to fix the problem, they needed
    some"new class" style so that the"old classes" would keep working
    but you can use the new more correct version.

    They decided that they would use a word"object", lowercased, to be
    the"class" that you inherit from to make a class. It is confusing,
    but a class inherits from the class named"object" to make a class but
    it's not an object really its a class, but don't forget to inherit
    from object.

    另外,为了让您了解新样式类和旧样式类的区别,新样式类总是继承自object类或继承自object类的另一个类:

    1
    2
    class NewStyle(object):
        pass

    另一个例子是:

    1
    2
    class AnotherExampleOfNewStyle(NewStyle):
        pass

    虽然旧样式的基类看起来像这样:

    1
    2
    class OldStyle():
        pass

    一个老式的儿童班是这样的:

    1
    2
    class OldStyleSubclass(OldStyle):
        pass

    您可以看到,旧样式的基类不会从任何其他类继承,但是,旧样式类当然可以从其他类继承。从对象继承可以保证在每个Python类中都可以使用某些功能。在python 2.2中引入了新的样式类


    是的,这是历史性的。如果没有它,它将创建一个旧的样式类。

    如果在旧样式的对象上使用type(),只会得到"instance"。在一个新样式的对象上,您得到它的类。


    类创建语句的语法:

    1
    2
    class <ClassName>(superclass):
        #code follows

    如果没有您特别想要继承的任何其他超类,那么superclass应该始终是object,它是python中所有类的根。

    从技术上讲,object是Python中"新型"类的根。但是,今天的新课程和唯一的课程一样好。

    但是,如果在创建类时没有显式地使用单词object,那么正如其他人提到的那样,python 3.x隐式地继承了object超类。但我想直白总比含蓄好(见鬼)

    参考文献