Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 多重继承、super()及其在Python中与参数的正确使用_Python 3.x_Oop_Inheritance_Multiple Inheritance - Fatal编程技术网

Python 3.x 多重继承、super()及其在Python中与参数的正确使用

Python 3.x 多重继承、super()及其在Python中与参数的正确使用,python-3.x,oop,inheritance,multiple-inheritance,Python 3.x,Oop,Inheritance,Multiple Inheritance,我试图理解python中的多重继承。我想“有点”明白了,但我少了一些。我知道如果我有两门课,我可以做如下事情: 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

我试图理解python中的多重继承。我想“有点”明白了,但我少了一些。我知道如果我有两门课,我可以做如下事情:

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,name,arg_b1,arg_b2,arg_a1,arg_a2...):
        A.__init__(self,name,arg_a1,arg_a2...)
        self.mm = False
        self.name = name

class C(B):
    def __init__(self,name,arg_c1,arg_c2,arg_b1,arg_b2,arg_a1,arg_a2.........):
        B.__init__(self,name,arg_b1,arg_b2,arg_a1,arg_a2...)
        self.name = name
所以我开始研究如何以一种有效的方式来做,而不仅仅是硬编码。那是我遇到多重继承的时候,也是我开始怀疑的时候

如果我有3门课:

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

c = C("p",1,5,name="p")
为什么这会给出一个错误,但将名称添加为init参数却不会

在另一个示例中,如果我将另一个参数添加到init的函数中,我会得到
TypeError:\uuuu init\uuuu()为参数'name'
获得多个值

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

c = C("p",1,5,name="p")
所以,在这一切之后,我想到了几个问题

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

所有这些让我明白了我每天使用的图书馆。可能他们中的一些人使用这种概念(我不知道,我想是这样)。当用户放入任何类中都不存在的
kwarg
时会发生什么?python如何“知道”
name
属于
class A
而不是
class B
或反之亦然?

我不明白,你的问题相当混乱,请重新措辞。简明扼要。只需重新编写所有问题。在您的示例中,C的构造函数使用前2个参数。之后,在B
name
is 5的构造函数中,
args
为空,
kwargs
name=“p”
=>名称有多个值。