Python 3.x 多重继承、super()及其在Python中与参数的正确使用
我试图理解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
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个参数。之后,在Bname
is 5的构造函数中,args
为空,kwargs
为name=“p”
=>名称有多个值。