You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:33:18