super
更适用于现代(新式)类,原因是它允许协同多重继承。以下是一个例子。
>>> class Foo(object):
... def display(self):
... print "In Foo"
...
>>> class Foo2(Foo):
... def display(self):
... print "In Foo2"
... super(Foo2, self).display()
... print "Back in Foo2"
...
>>> class Bar(Foo):
... def display(self):
... print "In Bar"
... super(Bar, self).display()
... print "Back in Bar"
...
>>> class FooBar(Foo2, Bar):
... pass
...
>>> FooBar().display()
In Foo2
In Bar
In Foo
Back in Bar
Back in Foo2
>>> class BarFoo(Bar, Foo2):
... pass
...
>>> BarFoo().display()
In Bar
In Foo2
In Foo
Back in Foo2
Back in Bar
请注意,我没有改变超类上的display
方法,但通过改变超类的排列顺序,子类上的display
方法是不同的。 BarFoo
和FooBar
有不同的方法。这是因为它们具有不同的方法解析顺序。
>>> BarFoo.__mro__
(<class '__main__.BarFoo'>, <class '__main__.Bar'>, <class '__main__.Foo2'>, <class '__main__.Foo'>, <type 'object'>)
>>> FooBar.__mro__
(<class '__main__.FooBar'>, <class '__main__.Foo2'>, <class '__main__.Bar'>, <class '__main__.Foo'>, <type 'object'>)
这意味着super
在每个子类中被调用时都会解析为一个不同的类。这使得每个重写方法可以改变正在进行的一小部分,只要它们愿意友好地协作,让每个父类对方法调用做出贡献。