Python中如何通过globals()动态调用类内部的方法
问题说明
现有示例代码如下:
class MyModules: def Play_Music(self): print(123) function_name = 'Play_Music'
需求是通过字符串形式的方法名,调用定义在MyModules类内部的Play_Music方法。直接使用globals()[function_name]会报错,尝试globals()[MyModules+function_name]()、globals()['MyModules.'+function_name]()也无法运行,核心原因有两点:
globals()仅能获取全局命名空间下直接注册的标识符,类内部的方法属于类的属性,存储在类的独立命名空间中,不会直接出现在全局字典里- 拼接
MyModules.Play_Music形式的字符串作为key查全局字典时,实际是在找全局作用域下名为MyModules.Play_Music的变量,这个变量本身不存在,全局作用域下仅存在MyModules这个类对象本身
实现方案
通过globals()拿到类对象后,使用Python内置的getattr()函数按字符串名动态获取类/实例的属性即可,根据调用的方法类型分两种场景:
场景1:调用普通实例方法
普通实例方法需要绑定类实例才能调用,实现代码如下:
# 从全局作用域获取目标类 target_cls = globals()['MyModules'] # 实例化类 instance = target_cls() # 动态获取实例上的目标方法并调用 getattr(instance, function_name)()
运行后会正常输出123。
场景2:调用静态方法/类方法
如果目标方法是被@staticmethod或@classmethod装饰的方法,不需要绑定实例,可以直接在类对象上获取方法调用:
# 静态方法/类方法无需实例化 target_cls = globals()['MyModules'] getattr(target_cls, function_name)()
注意事项
不要尝试把类名、属性名拼接成带.的字符串直接在globals()里查找,Python的命名空间不是按路径字符串存储的,所有对象的动态属性获取都应该用getattr(目标对象, 属性名字符串)实现,这是官方标准写法。
内容的提问来源于stack exchange,提问作者Rio 51
相关产品推荐
相关产品推荐

