python中的super有什么用_super在python中有什么用

所属网站分类: python高级 > 面向对象

作者:阿里妈妈

链接:

来源:python黑洞网

有什么区别?

class child(somebaseclass):

def __init__(self):

super(child, self).__init__()

class child(somebaseclass):

def __init__(self):

somebaseclass.__init__(self)

我们已经看到super在只有单继承的类中使用了很多,但也可以在多重继承中使用它,那么在这种情况下使用它的优点是什么?

somebaseclass.__init__(self)

意味着调用somebaseclass的__init__。而

super(child, self).__init__()

表示__init__从child实例的方法解析顺序(mro)中的父类调用绑定。

如果实例是child的子类,则mro中可能会有另一个父级。

我玩了一下super(),并且认识到我们可以改变呼叫顺序。

例如,我们有下一个层次结构:

a

/ \

b c

\ /

d

在这种情况下,d的mro将是(仅适用于python 3):

in [26]: d.__mro__

out[26]: (__main__.d, __main__.b, __main__.c, __main__.a, object)

让我们创建一个super()执行后调用的类。

in [23]: class a(object): # or with python 3 can define class a:

...: def __init__(self):

...: print("i'm from a")

...:

...: class b(a):

...: def __init__(self):

...: print("i'm from b")

...: super().__init__()

...:

...: class c(a):

...: def __init__(self):

...: print("i'm from c")

...: super().__init__()

...:

...: class d(b, c):

...: def __init__(self):

...: print("i'm from d")

...: super().__init__()

...: d = d()

...:

i'm from d

i'm from b

i'm from c

i'm from a

a

/ ⇖

b → c

⇖ /

d

因此我们可以看到解决方案顺序与mro中的相同。但是当我们super()在方法的开头调用时:

in [21]: class a(object): # or class a:

...: def __init__(self):

...: print("i'm from a")

...:

...: class b(a):

...: def __init__(self):

...: super().__init__() # or super(b, self).__init_()

...: print("i'm from b")

...:

...: class c(a):

...: def __init__(self):

...: super().__init__()

...: print("i'm from c")

...:

...: class d(b, c):

...: def __init__(self):

...: super().__init__()

...: print("i'm from d")

...: d = d()

...:

i'm from a

i'm from c

i'm from b

i'm from d

我们有一个不同的顺序,它颠倒了mro元组的顺序。

a

/ ⇘

b ← c

⇘ /

d

你可能感兴趣的:(python中的super有什么用_super在python中有什么用)