python中的super()函数

转载自:https://blog.csdn.net/killeri/article/details/80717322

最能感受到super函数的作用在于进行钻石继承的时候。 
钻石继承:由一个基类衍生两个及以上的超类,然后在衍生,在类树的最底层生成一个子类,这样的类树结构就是一个类似 钻石外形,所以,最底层类继承称为钻石继承

首先: 
这是直接通过超类调用方法给子类使用

class baseClass:
    num_base_calls = 0
    def call_me(self):
        print("Calling method on Base Class")
        self.num_base_calls += 1

class leftSubClass(baseClass):
    num_left_calls = 0
    def call_me(self):
        baseClass.call_me(self)
        print("Calling method on left SubClass")
        self.num_left_calls += 1

class rightSubClass(baseClass):
    num_right_calls = 0
    def call_me(self):
        baseClass.call_me(self)
        print("Calling method on right SubClass")
        self.num_right_calls += 1

class SubClass(leftSubClass, rightSubClass):
    num_sub_calls = 0
    def call_me(self):
        rightSubClass.call_me(self)
        leftSubClass.call_me(self)
        print("Calling method on SubClass")
        self.num_sub_calls += 1
s = SubClass()
print(s.call_me())
print(s.num_sub_calls, s.num_left_calls, s.num_right_calls, s.num_base_calls)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
结果是:

Calling method on Base Class
Calling method on right SubClass
Calling method on Base Class
Calling method on left SubClass
Calling method on SubClass
1 1 1 2
1
2
3
4
5
6
这是通过super()函数实现继承

class baseClass:
    num_base_calls = 0
    def call_me(self):
        print("Calling method on Base Class")
        self.num_base_calls += 1

class leftSubClass(baseClass):
    num_left_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on left SubClass")
        self.num_left_calls += 1

class rightSubClass(baseClass):
    num_right_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on right SubClass")
        self.num_right_calls += 1

class SubClass(leftSubClass, rightSubClass):
    num_sub_calls = 0
    def call_me(self):
        super().call_me()
        print("Calling method on SubClass")
        self.num_sub_calls += 1
# 使用super()实例化一个超类对象可以实现,每个层次只是进行且只进行一次调用
# 就拿这个例子来说
s = SubClass()
print(s.call_me())
print(s.num_sub_calls, s.num_left_calls, s.num_right_calls, s.num_base_calls)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
结果是:

Calling method on Base Class
Calling method on right SubClass
Calling method on left SubClass
Calling method on SubClass
1 1 1 1
1
2
3
4
5
通过以上两个测试,第一个我们用超类直接调用他的方法在子类中实现了继承,但是我们看到这样的话每个超类都会在调用自身的call_me方法的同时也会调用超类的超类中的call_me方法,这样,baseClass就被执行了两次。第二个我们使用了super()方法在call_me方法中继承了超类的方法,这样就像注释里说的,它会根据继承的层次一个一个类的调用,所以baseClass类并不会被调用两次。这就是super()函数的作用
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值