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中如何在循环里动态调用方法名?
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’ 一个像方法名的字符串 这是肯定不行的
至于怎么去确保不调错, 我推荐自己去摸索
我也是新手 也说不清楚 还可能是错误的.

