多重继承,super及其在Python中与参数的正确使用

问题描述

我试图了解python中的多重继承。我认为是“ kinda”,但是我缺少了一些。我知道,如果我有两个方面,我可以做类似的事情:

class A():
    def __init__(self,name):
        self.name = name
     
class B(A):
    def __init__(self,name):
        A.__init__(self,name)
        self.mm = False
        self.name = name

b = B("Peter")

我的问题是当我有更多的类并且每个类都有自己的init参数时。乍一看,拥有这样的东西毫无意义:

class A():
    def __init__(self,name,arg_a1,arg_a2):
        self.name = name
     
class B(A):
    def __init__(self,arg_b1,arg_b2,arg_a2...):
        A.__init__(self,arg_a2...)
        self.mm = False
        self.name = name

class C(B):
    def __init__(self,arg_c1,arg_c2,arg_a2.........):
        B.__init__(self,arg_a2...)
        self.name = name

因此,我开始研究如何以有效的方式进行操作,而不仅仅是硬编码。那就是我遇到多重继承的时候,那是我的疑虑开始引起人们的注意的时候。

如果我有3个班级:

class A():
    def __init__(self,name):
        self.name = name
        
class B(A):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.mm = False
        self.name = name
        
class C(B):
    def __init__(self,a,j,**kwargs)
        self.a = a
        self.j = j

c = C("p",1,5,name="p")

为什么这样会出错,但是不能将名称添加为init参数呢?

在另一个示例中,如果我向A初始化函数添加另一个参数,则会得到TypeError: __init__() got multiple values for argument 'name'

class A():
    def __init__(self,lastname):
        self.name = name
        self.lastname = lastname
        
class B(A):
    def __init__(self,**kwargs):
        super().__init__(name,name="p")

所以,毕竟,我想到了几个问题。

  • 为什么生成此TypeError
  • 如何使继承“智能”?
  • 我是否总是需要将*args**kwargs用于多重继承?

所有这些使我明白了我每天使用的库。大概其中一些使用了这个概念(我不知道,我假设)。当用户放置任何类中都没有的kwarg时会发生什么情况? python如何“知道” name进入class A而不是class B或相反?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)