Python类继承obj

2024-04-26 06:44:12 发布

您现在位置:Python中文网/ 问答频道 /正文

类声明是否有理由继承自object

我只是找到了一些代码,我找不到一个很好的理由。

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

Tags: 代码声明objectmyclasscodeclass理由follows
3条回答

Python 3

  • class MyClass(object):=新样式类
  • class MyClass:=新样式类(隐式继承自object

Python 2

  • class MyClass(object):=新样式类
  • class MyClass:=旧式类

说明:

在Python 3.x中定义基类时,允许从定义中删除object。然而,这可以为一个严重的难以追踪的问题打开大门

Python在Python 2.2中引入了新的样式类,到目前为止,旧的样式类已经相当老了。旧样式类的讨论是buried in the 2.x docs,在3.x文档中不存在。

问题是,Python2.x中旧样式类的语法与Python3.x中新样式类的替代语法相同。Python 2.x仍然被广泛使用(例如GAE、Web2Py),任何代码(或编码器)无意中将3.x风格的类定义引入到2.x代码中,最终都会得到一些严重过时的基本对象。而且因为老式的课程不受任何人的关注,他们可能不知道是什么打动了他们。

所以只要把它拼出来,省去一些2.x开发者的眼泪。

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

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


Python 2.x的故事:

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

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

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. “new”样式的类:它们直接或间接地有一个基类:

    >>> 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'>,)
    

毫无疑问,当你在写一个类的时候,你总是想去学习新的类。这样做的好处很多,列举其中一些:

  • Support for descriptors。具体地说,以下构造可以使用描述符:

    1. ^{}:将类作为隐式参数而不是实例接收的方法。
    2. ^{}:不将隐式参数self作为第一个参数接收的方法。
    3. 属性与^{}:创建用于管理属性的获取、设置和删除的函数。
    4. ^{}:节省了类的内存消耗,也加快了属性访问。当然,它是impose limitations
  • ^{}静态方法:允许您自定义如何创建新的类实例。

  • Method resolution order (MRO):当试图解析要调用的方法时,将按什么顺序搜索类的基类。

  • 与MRO相关,^{} calls。另请参见,^{} considered super.

如果你不是从object继承的,就忘掉这些吧。关于前面的要点以及“新”样式类的其他优点的更详尽的描述可以在here中找到。

新型类的缺点之一是类本身对内存的要求更高。不过,除非你创建了许多类对象,否则我怀疑这是一个问题,它是一个消极的沉入积极的海洋。


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中:继承自object如果您编写的代码试图与Python无关,也就是说,它需要在Python 2和python3中同时工作。否则就没什么区别了,因为Python会在幕后为您插入它。

是的,这是一个“新样式”对象。这是python2.2中引入的一个特性。

新样式对象与经典对象具有不同的对象模型,有些对象不能与旧样式对象一起正常工作,例如super()@property和描述符。请参阅this article以获得有关新样式类的详细说明。

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

相关问题 更多 >