Python通过字符串调用函数或方法的三种实现方式

Nora
Nora
发布时间:2026-10-13 | 2人浏览过
原创

本文介绍Python中如何通过字符串动态调用函数或方法。针对字符串无法直接调用的问题,详细解析了eval、globals/locals字典访问以及getattr内建函数三种实现方案,对比了各方法的功能与安全性,帮助开发者选择合适的方式。

前言

本文主要介绍了在Python中通过字符串调用函数或方法的相关技术,供读者参考学习。下文将展开详细介绍。

首先来看一个具体场景:

>>> def foo():
    print "foo"

>>> def bar():
    print "bar"

>>> func_list = ["foo","bar"]
>>> for func in func_list:
    func()
TypeError: 'str' object is not callable

假设我们需要遍历执行列表中的函数,但列表中存储的是函数名的字符串。此时直接尝试调用会抛出类型错误,因为字符串对象本身不具备可调用性。如果我们希望将字符串转换为可调用对象,或者希望通过变量名动态访问模块属性及类的属性,该如何实现?

以下提供三种可行的实现方法。

eval()函数

>>> for func in func_list:
    eval(func)()
foo
bar

eval()通常用于执行一个字符串形式的表达式,并返回表达式的结果。在此场景下,它可以将字符串转换为对应的函数并执行。尽管eval()功能强大,但因其存在安全风险(常被称为“eval is evil”),一般不建议在生产环境中使用。

locals()和globals()函数

>>> for func in func_list:
    locals()[func]()
foo
bar

>>> for func in func_list:
    globals()[func]()
foo
bar

locals()和globals()是Python的两个内置函数,它们允许以字典的形式访问局部变量和全局变量。

getattr()函数

getattr()是Python的内建函数,其用法getattr(object, name)等价于访问object.name,但这里的name可以是一个变量。

获取foo模块中的bar方法

>>> import foo
>>> getattr(foo, 'bar')() 

获取Foo类的属性

>>> class Foo:
  def do_foo(self):
    ...

  def do_bar(self):
    ...

>>> f = getattr(foo_instance, 'do_' + opname)
>>> f()

总结

以上就是本文的全部内容,希望这些内容能对各位的学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。

参考

Calling a function of a module from a string with the function's name in Python

How do I use strings to call functions/methods?

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表