首页 文章

Python类继承了对象

提问于
浏览
851

是否有任何理由要从 object 继承类声明?

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

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

7 回答

  • 502

    是的,这是historical . 没有它,它会创建一个旧式的类 .

    如果在旧式对象上使用 type() ,则只需"instance" . 在一个新式的对象上你得到它的类 .

  • 6

    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中引入了新式的类,到现在为止,旧式的类已经很老了 . 对旧式类的讨论是buried in the 2.x docs,并且在3.x文档中不存在 .

    问题是, the syntax for old-style classes in Python 2.x is the same as the alternative syntax for new-style classes in Python 3.x . Python 2.x仍然被广泛使用(例如GAE,Web2Py),并且任何代码(或编码器)无意中将3.x样式的类定义带入2.x代码将最终导致一些严重过时的基础对象 . 而且由于旧式课程并不在人们的视线范围内,他们可能不知道是什么打击了他们 .

    因此,只需拼出它就可以节省一些2.x开发人员的眼泪 .

  • 1

    这会创建一个new-style class .

  • 350

    来自Learn Python the Hard Way的历史:

    Python的一个类的原始演绎以许多严肃的方式被打破 . 当这个错误得到承认时已经太晚了,他们不得不支持它 . 为了解决这个问题,他们需要一些“新类”风格,以便“旧类”继续工作,但你可以使用新的更正确的版本 . 他们决定使用一个“对象”这个词,小写,是你继承的“阶级”来创建一个类 . 这是令人困惑的,但是一个类继承自名为“object”的类来创建一个类,但它不是一个对象,它实际上是一个类,但不要忘记从对象继承 .

    也只是为了让你知道新式类和旧式类之间的区别是什么,新的类总是继承自 object 类或继承自 object 的另一个类:

    class NewStyle(object):
        pass
    

    另一个例子是:

    class AnotherExampleOfNewStyle(NewStyle):
        pass
    

    旧式基类看起来像这样:

    class OldStyle():
        pass
    

    一个旧式的子类看起来像这样:

    class OldStyleSubclass(OldStyle):
        pass
    

    您可以看到Old Style基类不从任何其他类继承,但是,Old Style类当然可以相互继承 . 从对象继承可确保每个Python类都具有某些功能 . Python 2.2中引入了新的样式类

  • 391

    是的,这是一个“新风格”的对象 . 这是python2.2中引入的一个功能 .

    新样式对象具有与经典对象不同的对象模型,并且某些内容将无法与旧样式对象一起正常工作,例如 super()@property 和descriptors . 有关新样式类的详细说明,请参阅this article .

    SO链接描述差异:What is the difference between old style and new style classes in Python?

  • 30

    类创建语句的语法:

    class <ClassName>(superclass):
        #code follows
    

    在没有您特别想要继承的任何其他超类的情况下, superclass 应始终为 object ,这是Python中所有类的根 .

    object 在技术上是Python中"new-style"类的根 . 但今天的新式课程与唯一的课程风格一样好 .

    但是,如果在创建类时没有显式使用单词 object ,那么正如其他人所提到的,Python 3.x隐式继承自 object 超类 . 但我猜显然总是好于隐含(地狱)

    Reference

  • 25

    类声明是否有任何理由从对象继承?

    tl; dr:在Python 3中,除了Python 2和3之间的兼容性之外,没有理由 . 在Python 2中,有很多原因 .


    Python 2.x故事:

    在Python 2.x(从2.2开始)中,根据 object 作为基类的存在与否,有两种类型的类:

    • "classic" style 类:它们没有 object 作为基类:
    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
    • "new" style 类:它们直接或间接(例如从built-in type继承), 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'>,)
    

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

    如果你没有从 object 继承,请忘记这些 . 可以在here找到前面几个要点的详尽描述以及"new"样式类的其他特权 .

    新式类的缺点之一是类本身对内存要求更高 . 但是,除非你创造了许多阶级对象,否则我怀疑这将是一个问题,并且它在积极的海洋中是负面的沉没 .


    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]
    

    那么,你该怎么办?

    In Python 2: 始终显式地从 object 继承 . 获得额外津贴 .

    In Python 3:object 继承,如果你正在编写试图与Python无关的代码,也就是说,它需要在Python 2和Python 3中工作 . 否则,它实际上没有区别,因为Python在你后面插入它场景 .

相关问题