Python中如何在循环里动态调用方法名?

a1,a2,a3… 是方法名
之前写的程序这样
threading.Thread(target=self.run, args=(a1, *args)).start()
threading.Thread(target=self.run, args=(a2, *args)).start()
threading.Thread(target=self.run, args=(a3, *args)).start()

改为循环调用
for i in range(1,num):
threading.Thread(target=self.run, args=(a+str(i), *args)).start()
报这个错误 TypeError: unsupported operand type(s) for +: ‘int’ and 'str’

调用的方法名 还不能是字符串,这种情况
大神如何解决
Python中如何在循环里动态调用方法名?


7 回复

getattr(sys.modules[name], ‘a{}’.format(i))


在Python里动态调用方法名,循环里用getattr()就行。

比如你有个类,方法名存在列表里,想挨个调用:

class MyClass:
    def method_a(self):
        return "A"
    def method_b(self):
        return "B"
    def method_c(self):
        return "C"

obj = MyClass()
methods_to_call = ['method_a', 'method_b', 'method_c']

for method_name in methods_to_call:
    # 关键在这:getattr拿到方法,然后调用
    method = getattr(obj, method_name)
    result = method()  # 执行方法
    print(f"{method_name}: {result}")

如果方法不存在,getattr会抛AttributeError。想安全点可以给个默认值,或者先hasattr()判断一下:

for method_name in methods_to_call:
    if hasattr(obj, method_name):
        method = getattr(obj, method_name)
        result = method()
        print(f"{method_name}: {result}")
    else:
        print(f"方法 {method_name} 不存在")

简单说就是:getattr(对象, '方法名')()

总结:用getattr()在循环里动态调方法。

话虽如此,但还是建议你做一个 function_map = {‘a1’: a1, ‘a2’: a2} 这样

或者干脆 function_list = [a1, a2] 这样

谢谢哈

a+str(i) 是否 指向的位置 和 a1 指向的位置一样?
如果不一样 args 肯定是不能接收这个参数的

我个人理解 (可能是错误的) 是 a1 是指向 函数的一个对象
而 你循环里的是 一个’a1’…‘a2’… 是有区别的.



threading.Thread(target=self.run, args=(a+str(i), *args)).start() 里面的 a 是什么? 字符串? 还是什么, +str(i), 是想做字符串拼接 然后 动态的 a1 a2 a3 么?
这种情况 是不能这样操作 字符串拼接的
应该用 list, list 可以接收 函数 为成员, 把你的要用的函数全部放进 list 里面 (这一步很有说法 )

再调用的时候 for 循环 list[i] 就可以了 此时 args 接收的就是一个函数的引用

总的来说 你要确保你在循环里 调用的是一个 方法的引用 也就是方法名
而不是其他的 比如 ‘a1’ 一个像方法名的字符串 这是肯定不行的
至于怎么去确保不调错, 我推荐自己去摸索
我也是新手 也说不清楚 还可能是错误的.

回到顶部