python super用法_Python super使用步骤详解

Python 2 的话,记得继承 object:

# 默认, Python 3

class A:

pass

# Python 2

class A(object):

pass

Python 3 和 Python 2 的另一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :

# 默认,Python 3

class B(A):

def add(self, x):

super().add(x)

# Python 2

class B(A):

def add(self, x):

super(B, self).add(x)

单继承

class A:

def __init__(self):

self.n = 2

def add(self, m):

print('self is {0} @A.add'.format(self))

self.n += m

class B(A):

def __init__(self):

self.n = 3

def add(self, m):

print('self is {0} @B.add'.format(self))

super().add(m)

self.n += 3

b = B()

b.add(2)

print(b.n)

执行结果如下:

self is <__main__.b object at> @B.add

self is <__main__.b object at> @A.add

8

这个结果说明了两个问题:

1、super().add(m) 确实调用了父类 A 的 add 方法。

2、super().add(m) 调用父类方法 def add(self, m) 时, 此时父类中 self 并不是父类的实例而是子类的实例, 所以 b.add(2) 之后的结果是 5 而不是 4 。

多继承

class A:

def __init__(self):

self.n = 2

def add(self, m):

# 第四步

# 来自 D.add 中的 super

# self == d, self.n == d.n == 5

print('self is {0} @A.add'.format(self)) # 4.执行A中的代码

self.n += m # 5. n=7 [B, C, A, object]

# d.n == 7

class B(A):

def __init__(self):

self.n = 3

def add(self, m):

# 第二步

# 来自 D.add 中的 super

# self == d, self.n == d.n == 5

print('self is {0} @B.add'.format(self))

# 等价于 suepr(B, self).add(m)

# self 的 MRO 是 [D, B, C, A, object]

# 从 B 之后的 [C, A, object] 中查找 add 方法

super().add(m) # 2.进C

# 第六步

# d.n = 11

self.n += 3 # 7.继续执行B中剩余代码 n=14 [B, C, A, object]

# d.n = 14

class C(A):

def __init__(self):

self.n = 4

def add(self, m):

# 第三步

# 来自 B.add 中的 super

# self == d, self.n == d.n == 5

print('self is {0} @C.add'.format(self))

# 等价于 suepr(C, self).add(m)

# self 的 MRO 是 [D, B, C, A, object]

# 从 C 之后的 [A, object] 中查找 add 方法

super().add(m) # 3.进A 然后继续往下执行

# 第五步

# d.n = 7

self.n += 4 # 6.继续执行C中剩余代码 n=11 [B, C, A, object]

# d.n = 11

class D(B, C):

def __init__(self):

self.n = 5

def add(self, m):

# 第一步

print('self is {0} @D.add'.format(self))

# 等价于 super(D, self).add(m)

# self 的 MRO 是 [D, B, C, A, object]

# 从 D 之后的 [B, C, A, object] 中查找 add 方法

super().add(m) # 1.进B

# 第七步

# d.n = 14

self.n += 5 # 8.继续执行D中剩余代码 n=19 [B, C, A, object]

# self.n = 19

d = D()

d.add(2)

print(d.n)

运行结果:

self is <__main__.d object at> @D.add

self is <__main__.d object at> @B.add

self is <__main__.d object at> @C.add

self is <__main__.d object at> @A.add

19

文章来源:runoob.com/w3cnote/python-super-detail-intro.html

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值