从主python调用函数

时间:2015-03-15 21:57:42

标签: python class

我有一些python 3.4代码可以正常工作:

def run():
    m = 0
    while m != 1:    
        p = input('Please choose p: ')
        p = makeInt(p)
        #Some other code
        print(p)
        m = makeInt(input('Enter 1 if you would like to quit: '))

def makeInt(i):
    try:
        i = int(i)
    except ValueError:
        i = input('Incorrect input! Enter your answer: ')
        i = makeInt(i)
    return i

#Some other functions    

if __name__ == '__main__':
    run()

我想将所有这些代码放在一个类中(除了可能if __name__ == ...)当我把所有代码包括if __name__ == ...放在类似的类中时:

class Foo(object):
    def run(self):
        m = 0
        while m != 1:    
            p1 = input('Please choose p: ')
            p1 = self.makeInt(p1)
            #Some other code
            print(p1)
            m = self.makeInt(input('Enter 1 if you would like to quit: '))

    def makeInt(self, i):
        try:
            i = int(i)
        except ValueError:
            i = input('Incorrect input! Enter your answer: ')
            i = self.makeInt(i)
        return i
    #Some other functions and stuff

    if __name__ == '__main__':
        run()

我收到以下错误:TypeError: run() missing 1 required positional argument: 'self'。当我从run()中移除self参数时,它会一直运行,直到makeInt()被调用,然后我得到:NameError: name 'makeInt' is not defined。如果我将if语句从类中取出并调用Foo.run(),我会得到同样的错误。我在这个程序的前面有一些其他代码,当我从同一个类中的另一个函数调用类的函数时,它可以工作。我意识到我不必将所有代码放在一个类中,但在这种情况下我想要。为什么我会收到这些错误,我该怎么做才能将我的工作代码放在一个类中?

3 个答案:

答案 0 :(得分:2)

正如其他人所提到的,通过将函数放在一个类中,你已经创建了它们的方法,这意味着它们需要一个这个类的实例作为第一个参数。因此,您确实可以使用run来调用Foo().run()方法,因为Foo()会创建Foo的实例。

另一种方法(例如,除了封装之外你不需要其他任何东西)是使用static装饰器制作它们staticmethod

class Foo(object):
    @staticmethod
    def run():
        ...

    @staticmethod
    def makeInt(i):
        ...

if __name__ == '__main__':
    Foo.run() # don't need an instance as run is static

在Python中,方法可以是静态的,即不需要任何特殊参数,类方法,即第一个参数是类本身,或者是标准方法,即第一个参数是类的实例。

答案 1 :(得分:1)

由于您将代码包装在一个类中,因此run()是一种方法。您应该通过取消隐藏它并初始化班级实例来从班级中移除main

if __name__ == '__main__':
    Foo().run()

答案 2 :(得分:0)

由于缩进,它认为警卫是你班级的一部分:你的警卫缩进到与其他班级成员相同的水平。

取消
if __name__ == '__main__'

同时将其更改为

if __name__ == '__main__':
  main()

然后在新创建的main()函数中实例化一个Foo类型的新对象

def main():
  newFoo = Foo()
  newFoo.run()