【问题标题】:call a function in different class in python在python中调用不同类中的函数
【发布时间】:2017-06-22 05:12:00
【问题描述】:

这是我的代码。我是 Python 的初学者。我尝试在func2func3Apple 中调用func。在我谷歌我的问题后,我发现它可以通过使用@staticmethod 来工作,但我想找出另一种不使用@staticmethod 的方法。在func3中,我没有使用@staticmethod,所以报错:print(mycall.func3(3) ) TypeError: func3() takes exactly 1 argument (2 given) 有谁知道如何解决我的问题?谢谢。

class mango:
    def func(self):
        a=8
        b=9
        return a+b       


class Apple:

    @staticmethod
    def func2(x,y):
        temp=mango()
        c=temp.func()
        z=x+y+c    
        return z


    def func3(val):
        temp = mango()
        d = temp.func()
        output = d + val
        return output


if __name__ == '__main__':

    print "Hello, Python!"

    a = []
    b =[]
    ans = Test(a,b)
    print(ans.cc)
    mycall = Apple()
    print(mycall.func2(2,3)) 
    print(mycall.func3(3) )

【问题讨论】:

  • def funcx(self, par1, par2) 将自身添加到类方法
  • 顺便说一句:当您调用 mycall.func3(3) 时,它的处理方式几乎与 func3(mycall, 3) 一样,因此您需要 self 才能获得 mycall

标签: python


【解决方案1】:

每当你创建一个方法(实例的函数)时,你需要给它一个参数self。这就是它的工作原理。

所以,你需要改变:

def func3(val):

到:

def func3(self, val):

【讨论】:

  • instance's function 将是一个更好的术语,而不是 class' function
【解决方案2】:

理想情况下,您应该使用 @staticmethod 装饰器定义 func3 函数。但是既然你提到了,你不想将它定义为静态方法,为了修复错误你可以将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)。


必读参考资料:

【讨论】:

    【解决方案3】:

    当您在类中创建方法时(在本例中为 Apple 中的 func2func3),Python 将第一个参数视为 @987654322 @, 不管你如何称呼这个论点

    基本上,正在发生的事情是:

    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
    

    值得一提的是,如果你不使用实例本身,那么你不妨使用@staticmethod

    阅读更多:Why do you need explicitly have the "self" argument into a Python method?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2012-02-27
      • 2013-08-03
      相关资源
      最近更新 更多