class Base1:
def __init__(self,a):
self.a=a
def addition(self):
return self.a + self.a
class Base2:
def __init__(self,b):
self.b=b
def multipl(self):
return self.b*self.b
class Sub(Base1,Base2):
def __init__(self,a,b):
super().__init__(a,b)
H=Sub(4,5)
print(H.addition())
print(H.multipl())
TypeError:init((接受2个位置参数,但有3个给定了
好吧,当我这样做的时候,我所期望的会发生,为什么?什么是"*args";如何避免那个错误?
class Base1:
def __init__(self,a,*args):
super().__init__(*args)
self.a=a
def addition(self):
return self.a + self.a
class Base2:
def __init__(self,b,*args):
super().__init__(*args)
self.b=b
def multipl(self):
return self.b*self.b
class Sub(Base1,Base2):
def __init__(self,a,b):
super().__init__(a,b)
H=Sub(4,5)
print(H.addition())
print(H.multipl())
在功能失调的第一个程序中,您似乎希望Sub.__init__
的super().__init__(a,b)
同时调用Base1和Base2的__init__
,并神奇地将a
分配给前者,将b
分配给后者,但事实并非如此;实际上,只有Base1.__init__
是用隐式self
和另外两个参数a
和b
调用的,这使得错误消息正确地抱怨的三个参数__init__
((采用了2个位置参数,但给出了3个
Base1到def __init__(self,a,*args):
的更改捕获了*args
中的第三个参数b
,因此不再有多余的参数;你还不如def __init__(self, a, b):
。
让我向您解释在任何函数中使用*args的基本目的,我希望它能帮助您理解*args在函数中的用途:
让一个函数:
def total(a,b):
return a+b
print(total(1,2,3,4))
它会给你以下错误:
Traceback (most recent call last):
File "stack.py", line 3, in <module>
print(total(1,2,3,4))
TypeError: total() takes 2 positional arguments but 4 were given
这是因为我们在函数"total"中定义了两个参数,但在调用函数时传递了4个参数,请记住,我们不能传递超过两个参数。因此,为了解决这个问题,我们使用*args,它表示函数中将传递n个参数。使用*args的相同函数如下:
def all_total(*args):
total = 0
for i in args:
total+=i
return total
print(all_total(1,2,3,4,5,5))
它将输出20。它表明,现在我们可以在任何函数中传递任何数量的参数,而不会出现任何错误,这就是*args的神奇之处。在您的案例中,init函数也是如此。
我希望它能帮助你,欢迎使用python:(