首页 技术 正文
技术 2022年11月17日
0 收藏 370 点赞 2,376 浏览 892 个字

super() 详解

https://www.cnblogs.com/poloyy/p/15223443.html

多继承中使用 super()

class A:
def test(self):
print("AAA")class B:
def test(self):
print("BBB")class C(A, B):
def test(self):
print("CCC")
super().test()c = C()
c.test()# 输出结果
CCC
AAA

根据 MRO,super() 很明显调用的是 A 类的 test() 方法

假设想调用 B 类的 test() 方法,要怎么做呢?

方式

class C(A, B):
def test(self):
print("CCC")
super().test()
B.test(self)# 输出结果
CCC
AAA
BBB

通过 父类名.方法名() 即可,但这样和 super() 混用,不是一个好编码习惯,具体看下面

混用super() 和 显示类调用

class A:
def __init__(self):
print("A", end=" ")
super().__init__()class B:
def __init__(self):
print("B", end=" ")
super().__init__()class C(A, B):
def __init__(self):
print("C", end=" ")
A.__init__(self)
B.__init__(self)print("MRO:", [x.__name__ for x in C.__mro__])
C()# 输出结果
MRO: ['C', 'A', 'B', 'object']
C A B B

B 类的 __init__() 方法被调用了两次

为什么呢?

  • C 类里面又通过 B.__init__() 显式的调用了一次
  • 从 MRO 可以看到,A 类后面跟的是 B 类,所以 A 类的 super() 会调用 B 类
  • 一共调用了两次

如何避免

  • 在多继承场景中,super() 的使用必须一致,即在类的层次结构中,要么全部使用 super(),要么全不用!坚决不混用
  • 继承父类时应该查看类的层次结构,就是使用类的 __mro__  属性,或者 mro() 方法查看相关类的 MRO
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,105
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,582
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,429
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,836
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,919