python中super().__init__()的用法
作者:BeanInJ 发布时间:2023-09-06 11:43:07
标签:python,super,init
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


猜你喜欢
- 方法: 使用urlencode函数urllib.request.urlopen()import urllib.requestimport u
- 摘要RepVgg通过结构重参数化让VGG再次伟大。 所谓“VGG式”指的是:没有任何分支结构。即通常
- 项目中遇到图片实际显示尺寸的判定问题,图片可能被缩放过,所以实际显示的宽高无法通过常见的各种width,height拿到(都是得到图像的自然
- 目前网络上有许多图片验证码形式,那些没有生成图片的验证码的抗破解防御能力简直不堪一击;有人直接在网页源码里显示出具体的数字,然后要求访问者输
- Django2.0 通过URL访问上传的文件(pdf、picture等)Django是一个成熟的web框架,基于python实现,有很多的优
- PHP使用缓存即时输出内容(output buffering)的方法。分享给大家供大家参考。具体如下:$buffer = ini_get(&
- 在通过拼组sql语句来实现数据插入的应用中,我们很有可能会遇到需要插入大型数据的情况,例如,在oracle中需要插入字节数超过4000的字段
- 在 玉伯 的文章 《一道大题目,嘿嘿》 中有这样一段代码:[] == ![]也许很多同学迷惑:咦,这个如何转换呢?首先,我们了解下逻辑 NO
- 在你自己安装了一个新的MySQL服务器后,你需要为MySQL的root用户指定一个目录(缺省无口令),否则如果你忘记这点,你将你的MySQL
- 问题用过 tensorflow 的人都知道, tf 可以限制程序在 GPU 中的使用效率,但 pytorch 中没有这个操作。思路于是我想到
- 看了好多登录注册和注销的教程,很乱,很迷,然后总结了一下,简单的做了一个登录,注册和注销的页面。1,首先,使用pycharm创建一个项目单击
- 1、局部变量name = "Yang Li"def change_name(name): print(&qu
- 所谓贪婪匹配就是匹配重复字符是尽可能多的匹配,比如:"aaaaa".match(/a+/); //["aaaa
- 1、集合相加a = {1,2,3}b = {3,4,5}print(type(a))print(a|b)2、queryset 符合条件的筛序
- 本文实例讲述了Python3.5编程实现修改IIS WEB.CONFIG的方法。分享给大家供大家参考,具体如下:#!/usr/bin/env
- python中最基本的数据类型如下:Number(数字)String(字符串)List(列表)Tuple(元组)Dictionary(字典)
- php中可以使用 mb_detect_encoding() 函数来判断字符串是什么编码的。当在php中使用mb_detect_encodin
- 注:对多选按钮操作。 1:批量全选添加、批量移除。 2:行单选添加、移除。 3:分页之后(全选或不选)状态标识依然存在 /* *****&g
- 前沿Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对
- 好久没有写ASP代码了,今天在做一个简单的留言本时,出现了一下错误:Microsoft Office Access Database Eng