Python – 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基类,有两种类型的类:

  1. “经典”样式类:它们没有object基类:
    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
  2. “新”样式类:它们直接或间接(例如从内置类型继承)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,请忘记这些。可以在此处找到有关前一个要点的更详尽描述以及“新”样式类的其他特权。

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


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和Python 3中工作。否则,它实际上没有区别,因为Python为您插入它在幕后。


Python 3.x:
class MyClass(object): = new-style class 
class MyClass:= new-style class(隐式继承自object)

Python 2.x:
class MyClass(object): = new-style class 
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开发人员的眼泪。

添加评论

友情链接:蝴蝶教程