在类中运行所有函数

2024-05-12 21:38:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着在课堂上运行所有的函数,而不是单独打印出来。

class Foo(object):
    def __init__(self,a,b):
        self.a = a
        self.b=b

    def bar(self):
        print self.a

    def foobar(self):
        print self.b

我想这样做,但有一个循环,因为我的实际类有大约8-10个函数。

x = Foo('hi','bye')
x.bar()
x.foobar()

Tags: 函数selfobjectfooinitdefbarhi
3条回答

可以使用dir()__dict__遍历对象的所有属性。您可以使用isinstance()^{}来判断哪些是函数。只要调用任何函数。

更新

正如Tadhg所评论的,inspect.ismethod似乎是最好的选择。下面是一些示例代码:

import inspect
from itertools import ifilter


class Foo(object):
    def foo1(self):
        print('foo1')

    def foo2(self):
        print('foo2')

    def foo3(self, required_arg):
        print('foo3({!r})'.format(required_arg))

f = Foo()
attrs = (getattr(f, name) for name in dir(f))
methods = ifilter(inspect.ismethod, attrs)
for method in methods:
    try:
        method()
    except TypeError:
        # Can't handle methods with required arguments.
        pass

您可以获取实例的所有“public”方法的列表:

x = Foo('hi','bye')

public_method_names = [method for method in dir(x) if callable(getattr(x, method)) if not method.startswith('_')]  # 'private' methods start from _
for method in public_method_names:
    getattr(x, method)()  # call

有关getattr的详细信息 实际上,Python没有publicprivate语义,如果感兴趣,可以读取that

这是解决这个问题的最简单的方法,而且在里面做一些改变也是很灵活的。

import threading
from threading import Thread

class ClassName():
    def func1(self):
        print ('2')

    def func2(self):
        print ('3')

    def runall(self):
        if __name__ == '__main__':
            Thread(target = self.func1).start()
            Thread(target = self.func2).start()
run = ClassName()
run.runall() # will run all the def's in the same time

相关问题 更多 >