代码之家  ›  专栏  ›  技术社区  ›  rmh

为什么需要在Python中从对象中进行子类划分?

  •  15
  • rmh  · 技术社区  · 15 年前

    我使用Python已经有一段时间了,我仍然不确定为什么要从 object . 这两者有什么区别:

    class MyClass():
        pass
    

    还有这个:

    class MyClass(object):
        pass
    

    据我所知, 对象 是所有类的基类,并且暗示了子类化。您是否从它的显式子类化中得到了什么?最“蟒蛇”的事情是什么?

    2 回复  |  直到 7 年前
        1
  •  12
  •   Community Mohan Dere    8 年前

    这是python 2.x中的旧样式和新样式类。第二种形式是最新版本,并且存在于python2.2及更高版本中。对于新代码,您应该只使用新的样式类。

    在python 3.x中,您可以再次无所谓地使用这两种形式,因为新的样式只剩下一种,而且两种形式确实是等价的。但是我相信你应该继续使用 MyClass(object) 即使是对于3.x代码,也要使用至少直到广泛采用python 3.x,以避免与用于2.x的代码的潜在读者产生任何误解。

    对于某些特性,例如super(),旧样式类和新样式类之间的行为是非常不同的。

    请参见此处: New Style classes

    你也可以看到 here 就这样。

        2
  •  9
  •   wescpy    7 年前

    同意@kris、@noctis和@carson,以及我的更多颜色:

    class X: pass class X(): pass 是的同义词 经典课程 虽然 class X(object): pass 是为了 新型课程 ,如您所见:

    >>> class X:pass
    ... 
    >>> class Y(): pass
    ... 
    >>> class Z(object): pass
    ... 
    >>> 
    >>> type(X), type(Y), type(Z)
    (<type 'classobj'>, <type 'classobj'>, <type 'type'>)
    

    查看@kris提供的参考资料,了解更多有关差异的详细信息。在python 3中无效的是经典类的概念…原因是经典类已被弃用。所有这三个习语都只在任何3.x中创建新的风格类:

    >>> class X:pass
    ... 
    >>> class Y(): pass
    ... 
    >>> class Z(object): pass
    ... 
    >>> 
    >>> type(X), type(Y), type(Z)
    (<class 'type'>, <class 'type'>, <class 'type'>)
    

    底线?如果您正在用python 2编码,请尽量使用新样式的类。这样,您就已经在迁移路径中构建了,而且新样式的类提供了比经典类更多的功能。(这有点主观,但是如果您的[Classic]类相对简单,那么您可能不需要做任何事情来让它们在Python3中工作。)