经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
python中super().__init__()的用法
来源:jb51  时间:2023/3/29 10:07:36  对本文有异议

super().__ init__ ()有什么用?

  1. super().__init__() super(B,self).__init__()

1、分别理解super()和 __ init __()

1.1、super()

  1. 需要注意的是python23super写法稍有不同。

1.2、__ init __()

__init__() 是python中的构造函数,在创建对象的时"自动调用"。

  1. 定义类时可以不写init方法,系统会默认创建,
  2. 你也可以写一个,让你的类在创建时完成一些“动作”。

1.3、super(). __ init __()

如果子类B和父类A,都写了init方法,
那么A的init方法就会被B覆盖。想调用A的init方法需要用super去调用。

当然,在B内部,除了用super调用父类的方法,也可以用父类名调用,例:

  1. class B(A):
  2. def __init__(self):
  3. A.__init__(self)
  4. print("B init")
1.3.1、关于“覆盖”的疑问

有人可能会误解“覆盖”的意思,认为“覆盖”了就是没有,为什么还能通过super调用?
覆盖了并不是没有了,A的方法终都还在,但需要在B内部用super调用。

  1. 例:
  2. A里写了一个方法hi(), B继承自A, B里也写了一个方法hi()。
  3. B的对象在外部调用hi(), 就只能调用B里面写的这个hi()。
  4. 想通过B调用Ahi(),只能在B内部用super().hi()调用。
  1. class A:
  2. def hi(self):
  3. print("A hi")
  4.  
  5. class B(A):
  6. def hello(self):
  7. print("B hello")
  8. b = B()
  9. b.hi() # B里没有写hi(),这里调用的是继承自A的hi()
  10.  
  11. ------------------------------------------------------------------
  12. class A:
  13. def hi(self):
  14. print("A hi")
  15.  
  16. class B(A):
  17. def hi(self):
  18. print("B hi")
  19. b = B()
  20. b.hi() # 这里调用的就是B自己的hi()
  21. ------------------------------------------------------------------
  22. class A:
  23. def hi(self):
  24. print("A hi")
  25.  
  26. class B(A):
  27. def hi(self):
  28. super().hi() # 通过super调用父类A的hi()
  29. print("B hi")
  30. b = B()
  31. 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 实例:

  1. class A:
  2. def add(self, x):
  3. y = x+1
  4. print(y)
  5. class B(A):
  6. def add(self, x):
  7. super().add(x)
  8. b = B()
  9. b.add(2) # 3

Python2.x 实例:

  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. class A(object): # Python2.x 记得继承 object
  4. def add(self, x):
  5. y = x+1
  6. print(y)
  7. class B(A):
  8. def add(self, x):
  9. super(B, self).add(x)
  10. b = B()
  11. b.add(2) # 3

3、关于继承顺序

最底层:先写一个父类A

  1. class A:
  2. def __init__(self):
  3. print('A')

第二层:让 B、C、D 继承自A

  1. class B(A):
  2. def __init__(self):
  3. print('B')
  4. super().__init__()
  5.  
  6. class C(A):
  7. def __init__(self):
  8. print('C')
  9. super().__init__()
  10.  
  11. class D(A):
  12. def __init__(self):
  13. print('D')
  14. super().__init__()

第三层: E、F、G 继承

  1. class E(B, C):
  2. def __init__(self):
  3. print('E')
  4. super().__init__()
  5.  
  6. class F(C, D):
  7. def __init__(self):
  8. print('F')
  9. super().__init__()
  10.  
  11. class G(E, F):
  12. def __init__(self):
  13. print('G')
  14. 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、完整代码

 到此这篇关于python中super().__init__()的用法的文章就介绍到这了,更多相关super().__init__()的用法内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号