Причина, по которой 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
разрешает разные классы для каждого подкласса, в который он вызывается. Это позволяет каждому переопределяющему методуизменить небольшую часть того, что происходит, и при этом позволить любому другому суперклассу вносить свой вклад в вызов метода, если они желают хорошо играть.