Python中的旧样式类和新样式类有什么区别?什么时候我应该用一种或另一种?


当前回答

New-style类继承自object,并且在Python 2.2以后必须这样编写(即类Classname(object):而不是类Classname:)。核心变化是统一类型和类,这样做的好处是允许从内置类型继承。

更多细节请阅读描述介绍。

其他回答

Declaration-wise:

New-style类继承自object或另一个New-style类。

class NewStyleClass(object):
    pass

class AnotherNewStyleClass(NewStyleClass):
    pass

老式的类没有。

class OldStyleClass():
    pass

注意事项:

Python 3不支持旧样式的类,所以上面提到的任何一种形式都会产生新样式的类。

新的样式类可以使用super(Foo, self),其中Foo是类,self是实例。

超级(类型、对象或者类型) 返回一个代理对象,该对象将方法调用委托给类型的父类或兄弟类。这对于访问在类中被重写的继承方法非常有用。除了类型本身被跳过之外,搜索顺序与getattr()所使用的相同。

在Python 3中。X你可以简单地在类中使用super()而不带任何参数。

New-style类继承自object,并且在Python 2.2以后必须这样编写(即类Classname(object):而不是类Classname:)。核心变化是统一类型和类,这样做的好处是允许从内置类型继承。

更多细节请阅读描述介绍。

对于属性查找,旧样式的类仍然稍微快一些。这通常并不重要,但在性能敏感的Python 2中可能很有用。x代码:

In [3]: class A:
   ...:     def __init__(self):
   ...:         self.a = 'hi there'
   ...:

In [4]: class B(object):
   ...:     def __init__(self):
   ...:         self.a = 'hi there'
   ...:

In [6]: aobj = A()
In [7]: bobj = B()

In [8]: %timeit aobj.a
10000000 loops, best of 3: 78.7 ns per loop

In [10]: %timeit bobj.a
10000000 loops, best of 3: 86.9 ns per loop

Guido写了关于新型类的内幕,这是一篇关于Python中的新型和老式类的很棒的文章。

Python 3只有new-style类。即使你写了一个“老式类”,它也是隐式地从object派生的。

新型类具有一些老式类所缺乏的高级特性,如super,新的C3 mro,一些神奇的方法等。