在python

时间:2017-02-05 02:03:02

标签: python

这是我的代码。我是Python的初学者。我尝试在课程func的{​​{1}}和func2中致电func3。在我解决了我的问题之后,我发现它可以使用Apple工作,但我想在不使用@staticmethod的情况下找出另一种方法。在@staticmethod中,我没有使用func3,因此出现错误:@staticmethod 有谁知道如何解决我的问题?谢谢。

print(mycall.func3(3) )
TypeError: func3() takes exactly 1 argument (2 given)

3 个答案:

答案 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?