Python 函数调用类中的函数

Python 函数调用类中的函数,python,python-3.6,Python,Python 3.6,我有一个问题,我想要一个调用或执行类中所有函数的函数 class example: def foo(self): print("hi") def bar(self): print("hello") def all(self): self.foo() self.bar() 有没有更好的办法?因为我的类有大约20个函数,我只需要一个函数来调用它们。 感谢了解如何使用inspect或dir登记方法 虽然所有这些都

我有一个问题,我想要一个调用或执行类中所有函数的函数

class example:
    def foo(self):
        print("hi")
    def bar(self):
        print("hello")
    def all(self):
        self.foo()
        self.bar()
有没有更好的办法?因为我的类有大约20个函数,我只需要一个函数来调用它们。 感谢

了解如何使用inspect或dir登记方法

虽然所有这些都很丑陋,但检查是首选的方法。 您可以通过inspect调用对象的所有方法

import inspect

class A:
    def h(self):
        print ('hellow')

    def all(self):


        for name, f in inspect.getmembers(self, predicate=inspect.ismethod):

            if name != 'all' and not name.startswith('_'):
               f()


a = A()
a.all()
如果您喜欢dir,可以尝试-catch getattr(self,attr)()


我将其放在一起并对其进行了测试,它似乎可以工作,不需要任何库,并遵循您的原始意图:

class example:
    def __init__(self):
        n = self.__class__.__name__
        self.method_list = [func for func in dir(eval(n)) \
                            if callable(getattr(eval(n), func)) \
                            and func[0]!='_' \
                            and func!='run_all']
    def foo(self):
        print("hi")
    def bar(self):
        print("hello")
    def run_all(self):
        for m in self.method_list:
            runstring = 'self.' + m + '()'
            eval(runstring)  
使用它:

>> a = example()
>> a.run_all()
hello
hi
all
是一个Python命令,因此我将您的方法重命名为
run\u all

func!='“全部运行”
是必需的,这样您就不会出现令人讨厌的递归情况

让您列出方法,我限制它只是为了不列出私有方法


self.\uuuuu class\uuuu.\uuuu name\uuuu
获取您的类名

虽然我不确定这是否是最好的方法,但我建议如下

class AClass():

    def my_method_1(self):
        print('inside method 1')

    def my_method_2(self):
        print('inside method 2')

def run_my_methods():
    executor = AClass()
    all_methods = dir(executor)
    #separate out the special functions like '__call__', ...
    my_methods = [method for method in all_methods if not '__' in method]  
    for method in my_methods:
        eval('executor.%s()'%method)

run_my_methods()
输出为

inside method 1 
inside method 2

应该可以对所有方法进行迭代,但不会很好。您可以使用inspection,但会很好地工作,而不是正确地尝试检查您可以尝试调用每个成员的类型。如果有的话,静态或类方法可能没有什么问题。唯一的问题是,当函数返回打印时,它会工作。但是,在我的类中,每个函数都返回一个元素列表,这些元素与此代码不起作用。
inside method 1 
inside method 2