python中super().__init__()的用法
作者:BeanInJ 时间:2023-09-06 11:43:07
super().__ init__ ()有什么用?
super().__init__() 、 super(B,self).__init__()
1、分别理解super()和 __ init __()
1.1、super()
需要注意的是python2、3的super写法稍有不同。
1.2、__ init __()
__init__() 是python中的构造函数,在创建对象的时"自动调用"。
定义类时可以不写init方法,系统会默认创建,
你也可以写一个,让你的类在创建时完成一些“动作”。
1.3、super(). __ init __()
如果子类B和父类A,都写了init方法,
那么A的init方法就会被B覆盖。想调用A的init方法需要用super去调用。
当然,在B内部,除了用super调用父类的方法,也可以用父类名调用,例:
class B(A):
def __init__(self):
A.__init__(self)
print("B init")
1.3.1、关于“覆盖”的疑问
有人可能会误解“覆盖”的意思,认为“覆盖”了就是没有,为什么还能通过super调用?
覆盖了并不是没有了,A的方法终都还在,但需要在B内部用super调用。
例:
A里写了一个方法hi(), B继承自A, B里也写了一个方法hi()。
B的对象在外部调用hi(), 就只能调用B里面写的这个hi()。
想通过B调用A的hi(),只能在B内部用super().hi()调用。
class A:
def hi(self):
print("A hi")
class B(A):
def hello(self):
print("B hello")
b = B()
b.hi() # B里没有写hi(),这里调用的是继承自A的hi()
------------------------------------------------------------------
class A:
def hi(self):
print("A hi")
class B(A):
def hi(self):
print("B hi")
b = B()
b.hi() # 这里调用的就是B自己的hi()
------------------------------------------------------------------
class A:
def hi(self):
print("A hi")
class B(A):
def hi(self):
super().hi() # 通过super调用父类A的hi()
print("B hi")
b = B()
b.hi() # 这里调用的就是B里面的hi()
2、super() 在 python2、3中的区别
Python3.x 和 Python2.x 的一个区别: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
例:
python3 直接写成 : super().__init__()
python2 必须写成 :super(本类名,self).__init__()
Python3.x 实例:
class A:
def add(self, x):
y = x+1
print(y)
class B(A):
def add(self, x):
super().add(x)
b = B()
b.add(2) # 3
Python2.x 实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class A(object): # Python2.x 记得继承 object
def add(self, x):
y = x+1
print(y)
class B(A):
def add(self, x):
super(B, self).add(x)
b = B()
b.add(2) # 3
3、关于继承顺序
最底层:先写一个父类A
class A:
def __init__(self):
print('A')
第二层:让 B、C、D 继承自A
class B(A):
def __init__(self):
print('B')
super().__init__()
class C(A):
def __init__(self):
print('C')
super().__init__()
class D(A):
def __init__(self):
print('D')
super().__init__()
第三层: E、F、G 继承
class E(B, C):
def __init__(self):
print('E')
super().__init__()
class F(C, D):
def __init__(self):
print('F')
super().__init__()
class G(E, F):
def __init__(self):
print('G')
super().__init__()
看看G的继承顺序
我们发现G继承自E, F是并列的,初始化的时候不会先把E初始化完毕才初始化F。
4、从多个实例中对比super(python3)
下面是三种不同的继承、调用,对比他们的区别,搞清楚super().__init__()的用途。
4.1、实例
子类名称 | 继承内容 |
---|---|
Puple | 继承所有 |
Puple_Init | 继承,但覆盖了init方法 |
Puple_Super | 继承,但覆盖了init方法,并在init里面添加了super().__init__() |
4.2、运行结果与对比
4.3、完整代码
来源:https://blog.csdn.net/a__int__/article/details/104600972
标签:python,super,init
0
投稿
猜你喜欢
平面设计中的文字设计
2009-01-15 12:09:00
Python标准库defaultdict模块使用示例
2022-03-02 04:35:05
用Python获取亚马逊商品信息
2021-11-22 12:29:04
numpy.float32的典型用法
2022-04-30 04:36:30
解决python replace函数替换无效问题
2022-05-20 18:51:57
Windows 下 MySQL 8.X 的安装教程
2024-01-14 03:05:33
使用python爬取taptap网站游戏截图的步骤
2021-09-17 07:44:34
MySQL窗口函数实现榜单排名
2024-01-16 20:22:22
SQL Server日志文件总结及日志满的处理
2009-03-25 16:17:00
Python IDLE或shell中切换路径的操作
2022-06-03 18:05:32
Python设计模式之状态模式原理与用法详解
2022-04-16 06:37:36
编写脚本令Xtrabackup对MySQL数据进行备份的教程
2024-01-16 06:38:25
PHP队列用法实例
2023-10-20 12:30:49
MySQL最常见的操作语句小结
2023-12-27 19:33:56
JavaScript中使用ActiveXObject操作本地文件夹的方法
2024-04-17 09:48:32
OpenCV实战之AI照片背景替换
2022-06-11 06:58:09
扩展数据库系统选项实现更高的可扩展性
2009-01-06 11:14:00
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2021-12-18 11:20:02
Go 语言入门之Go 计时器介绍
2024-05-25 15:16:04
使用Spring AOP实现MySQL数据库读写分离案例分析(附demo)
2024-01-16 04:47:03