为什么 Python 类会继承对象?

发布于 2022-03-22 23:30:14

类声明有什么继承自的理由object吗?

我刚刚找到了一些执行此操作的代码,但我找不到很好的理由。

class MyClass(object):
    # class code follows...
关注者
0
被浏览
87
1 个回答
  • 面试哥
    面试哥 2022-03-22
    为面试而生,有面试问题,就找面试哥。

    类声明有什么继承自的理由object吗?

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


    Python 2.x 故事:

    在 Python 2.x(从 2.2 开始)中,有两种样式的类取决于object作为基类的存在与否:

    1. “经典”样式类:它们没有object作为基类:

    ```py

    class ClassicSpam: # no base class
    … pass
    ClassicSpam.bases
    ()
    ```


    1. “新”样式类:它们直接或间接(例如从内置类型继承)object作为基类:

    ```py

    class NewSpam(object): # directly inherit from object
    … pass
    NewSpam.bases
    (,)
    class IntSpam(int): # indirectly inherit from object…
    … pass
    IntSpam.bases
    (,)
    IntSpam.bases[0].bases # … because int inherits from object
    (,)
    ```

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

    • 支持描述符。具体来说,使用描述符可以实现以下构造:
    • classmethod:接收类作为隐式参数而不是实例的方法。
    • staticmethod:不接收隐式参数self作为第一个参数的方法。
    • properties with property:创建用于管理属性的获取、设置和删除的函数。
    • __slots__:节省类的内存消耗,也可以更快地访问属性。当然,它确实施加了限制
    • 静态方法:让您自定义如何创建新的__new__类实例。
    • 方法解析顺序(MRO):在尝试解析要调用的方法时,将按照什么顺序搜索类的基类。
    • 与 MRO 相关,super调用. 又见,super()算超。

    如果您不继承 from object,请忘记这些。可以在此处找到对前面的要点以及“新”样式类的其他好处的更详尽的描述。

    新型类的缺点之一是类本身对内存的要求更高。但是,除非您要创建许多类对象,否则我怀疑这将是一个问题,并且它是在积极海洋中的消极沉没。


    Python 3.x 故事:

    在 Python 3 中,事情被简化了。只有新样式的类存在(简单地称为类),因此,添加的唯一区别object是要求您再输入 8 个字符。这:

    class ClassicSpam:
        pass
    

    与此完全等效(除了他们的名字:-):

    class NewSpam(object):
         pass
    

    对此:

    class Spam():
        pass
    

    object在他们的__bases__.

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

    那你该怎么办?

    在 Python 2 中:总是从 显式继承object。获得福利。

    在 Python 3 中:如果您正在编写尝试与 Python 无关的代码,则继承自object,也就是说,它需要在 Python 2 和 Python 3 中都可以工作。否则不要,因为 Python 会为您插入它,所以它真的没有区别在幕后。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看