从主python调用函数

从主python调用函数,python,class,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

我有一些运行良好的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\uuu name\uuu==
..),当我放所有代码时,包括
if\uu name\uu==
。。。在这样的课堂上:

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()缺少1个必需的位置参数:“self”
。当我从
run()
中删除自参数时,它一直运行,直到调用
makeInt()
,然后我得到:
NameError:name'makeInt'未定义
。如果将if语句从类中取出并调用
Foo.run()
,则会出现相同的错误。在这个程序的前面,我有一些其他的代码,当我从同一个类中的另一个函数调用一个类的函数时,这些代码可以工作。我意识到我不必把所有的代码都放在一个类中,但在这种情况下,我想这样做。为什么我会出现这些错误?我该怎么做才能将我的工作代码放入一个类中

因为您将代码包装在一个类中,所以您的
run()
现在是一个方法。您应该取消类的身份并初始化类的实例,从而从类中删除
main

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

由于缩进,它认为守卫是类的一部分:你的守卫缩进到与其他类成员相同的级别。不相信

if __name__ == '__main__'
也把它改成

if __name__ == '__main__':
  main()
然后在新创建的main()函数中实例化一个Foo类型的新对象


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

另一种方法(例如,如果您不需要该类进行封装以外的任何操作)是使用decorator制作它们:

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中,一个方法可以是静态的,即不需要任何特殊参数,一个类方法,即第一个参数是类本身,或者一个标准方法,即第一个参数是类的实例。

但是如果你只将一个类用作名称空间,为什么不使用一个模块呢?我同意你的看法,但这是一个更好的问题,问OP谁特别想这样做。
class Foo(object):
    @staticmethod
    def run():
        ...

    @staticmethod
    def makeInt(i):
        ...

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