这是我的代码。我是Python的初学者。我尝试在课程func
的{{1}}和func2
中致电func3
。在我解决了我的问题之后,我发现它可以使用Apple
工作,但我想在不使用@staticmethod
的情况下找出另一种方法。在@staticmethod
中,我没有使用func3
,因此出现错误:@staticmethod
有谁知道如何解决我的问题?谢谢。
print(mycall.func3(3) )
TypeError: func3() takes exactly 1 argument (2 given)
答案 0 :(得分:3)
每当你创建一个方法(实例的函数)时,你需要给它一个参数self
。这是它的工作原理。
所以,你需要改变:
def func3(val):
为:
def func3(self, val):
答案 1 :(得分:0)
理想情况下,您应该使用func3
装饰器定义@staticmethod
函数。但是,既然您提到过,您不希望将其定义为静态方法,以便修复错误,您可以将self
定义为func3
中的第一个参数。因此func3
的定义应该是:
def func3(self, val):
# instead of > def func3(val):
原因是,当您调用函数时,如:
mycall.func3(3)
Python将mycall
的引用作为第一个参数传递,将剩余参数作为其余参数传递。该呼叫将由以下功能接收:
func3(mycall, 3)
因此,在上面的函数调用中,您传递了2个参数,但您当前的实现func3
只接受一个。这也提到了错误:
TypeError: func3() takes exactly 1 argument (2 given)
为什么我建议将其定义为静态方法,即使用@staticmethod
装饰器?您目前没有使用任何对类的引用'您的函数中的实例(即self
)。
必读参考文献:
答案 2 :(得分:0)
当你在类中创建方法时(在本例中, func2 和 func3 在 Apple 中),Python会将第一个参数视为{{ 1}},无论你称之为那个论点。
基本上,正在发生的事情是:
self
然后,在class MyClass(object):
#stuff
def myfunc(self, arg1):
#do stuff
return arg1
if __name__ == '__main__':
因此,为了修复您的代码,请尝试:
mycall = MyClass()
print(mycall.myfunc(5)) #In this instance, 5 is passed as arg1
值得一提的是,如果您不使用实例本身,那么您也可以使用def func3(self, val):
temp = mango()
d = temp.func()
output = d + val
return output
。
了解详情:Why do you need explicitly have the "self" argument into a Python method?。