鱼C论坛

 找回密码
 立即注册
查看: 2814|回复: 4

[已解决]python多继承

[复制链接]
发表于 2019-8-21 15:52:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python中子类如何继承多个父类的所有属性?
最佳答案
2019-8-21 16:29:49
新学 发表于 2019-8-21 16:27
还有所有父类中的构造函数__init__()中的从外部接收属性值的所有属性如何传递给子类?
  1. class A:
  2.     def __init__(self):
  3.         self.a = 1


  4. class B:
  5.     def __init__(self):
  6.         self.b = 1


  7. class C(A, B):
  8.     def __init__(self):
  9.         A.__init__(self)
  10.         B.__init__(self)
  11.         print(self.a)
  12.         print(self.b)


  13. C()
复制代码


运行结果为:

  1. 1
  2. 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-21 15:55:07 | 显示全部楼层
  1. class A:
  2.     a = 1


  3. class B:
  4.     b = 2


  5. class C(A, B):
  6.     def __init__(self):
  7.         print(C.a, C.b)


  8. C()
复制代码


运行结果为:

  1. 1 2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-21 16:27:41 | 显示全部楼层

还有所有父类中的构造函数__init__()中的从外部接收属性值的所有属性如何传递给子类?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-21 16:29:49 | 显示全部楼层    本楼为最佳答案   
新学 发表于 2019-8-21 16:27
还有所有父类中的构造函数__init__()中的从外部接收属性值的所有属性如何传递给子类?
  1. class A:
  2.     def __init__(self):
  3.         self.a = 1


  4. class B:
  5.     def __init__(self):
  6.         self.b = 1


  7. class C(A, B):
  8.     def __init__(self):
  9.         A.__init__(self)
  10.         B.__init__(self)
  11.         print(self.a)
  12.         print(self.b)


  13. C()
复制代码


运行结果为:

  1. 1
  2. 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-21 16:36:26 | 显示全部楼层
假設你要多重繼承的 各個父類關係是平行的, 多重繼承用於 組合各父類的成員 (Mixin 的概念), 那你可以考慮下面這個例子, 而為了展示通用性, 下面的例子中有三個可能被用來繼承的父類 A, B, C, 而其子類 (例如 X, Y)可以用任意順序來組合任意數量個父類:
  1. # base classes

  2. class A:
  3.     def __init__(self, a1, a2, **kwargs):
  4.         super().__init__(**kwargs)
  5.         self.a1 = a1
  6.         self.a2 = a2

  7.     def funa(self):
  8.         print("I'm funa")

  9. class B:
  10.     def __init__(self, b1, **kwargs):
  11.         super().__init__(**kwargs)
  12.         self.b1 = b1

  13.     def funb(self):
  14.         print("I'm funb")
  15.         
  16. class C:
  17.     def __init__(self, c1, c2, c3, **kwargs):
  18.         super().__init__(**kwargs)
  19.         self.c1 = c1
  20.         self.c2 = c2
  21.         self.c3 = c3

  22.     def func(self):
  23.         print("I'm func")
复制代码
  1. # derived classes

  2. class X(B, A, C):
  3.     def __init__(self, **kwargs):
  4.         super().__init__(**kwargs)
  5.         
  6. class Y(A, B):
  7.     def __init__(self, **kwargs):
  8.         super().__init__(**kwargs)
复制代码
  1. x = X(a1=1, a2=2, b1=3, c1=4, c2=5, c3=6)
  2. y = Y(a1=1, a2=2, b1=3)
  3. print(x.a1, x.a2, x.b1, x.c1, x.c2, x.c3)
  4. x.funa()
  5. y.funb()
  6. print(dir(x))
  7. print(dir(y))
复制代码
  1. 1 2 3 4 5 6
  2. I'm funa
  3. I'm funb
  4. ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a1', 'a2', 'b1', 'c1', 'c2', 'c3', 'funa', 'funb', 'func']
  5. ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a1', 'a2', 'b1', 'funa', 'funb']
复制代码


显示调用 __init__ 方法, 方法会自己继承,不用管(因为不重名):

  1. class A(object):
  2.     def __init__(self, a1,a2):
  3.         # super(ClassName, self).__init__()
  4.         self.a1 = a1
  5.         self.a2 = a2

  6.     def funa(self):
  7.         print("I'm funa")

  8. class B(object):
  9.     def __init__(self, b1):
  10.         # super(ClassName, self).__init__()
  11.         self.b1 = b1

  12.     def funb(self):
  13.         print("I'm funb")
  14.         
  15. class C(A, B):
  16.     def __init__(self, a1, a2, b1):
  17.         A.__init__(self, a1, a2)
  18.         B.__init__(self, b1)

  19. c = C(1, 2, 3)
  20. dir(c)
复制代码

  1. ['__class__',
  2. '__delattr__',
  3. '__dict__',
  4. '__doc__',
  5. '__format__',
  6. '__getattribute__',
  7. '__hash__',
  8. '__init__',
  9. '__module__',
  10. '__new__',
  11. '__reduce__',
  12. '__reduce_ex__',
  13. '__repr__',
  14. '__setattr__',
  15. '__sizeof__',
  16. '__str__',
  17. '__subclasshook__',
  18. '__weakref__',
  19. 'a1',
  20. 'a2',
  21. 'b1',
  22. 'funa',
  23. 'funb']
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-15 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表