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

    上一篇: Python class inherits object

    下一篇: Why use getters and setters/accessors?