在 Python 中通过字符串名称调用函数
通过字符串名称调用函数:
- 导入定义函数的模块。
- 使用 getattr() 函数获取函数。
- 调用函数。
main.py
# ✅ 如果函数位于不同的模块中 import example_module func = getattr(example_module, 'example_function') print(func('ab', 'cd')) # ?️ 'abcd' # ----------------------------------------------- # ✅ 如果函数位于同一模块中 def do_math(a, b): return a + b func = globals()['do_math'] print(func(10, 5)) # ?️ 15 # ----------------------------------------------- # ✅ 调用给定字符串名称的类方法 class Employee(): def __init__(self, first, last): self.first = first self.last = last def get_name(self): return self.first + ' ' + self.last cls = globals()['Employee'] emp1 = cls('fql', 'zadmei') func = getattr(emp1, 'get_name') print(func()) # ?️ fql zadmei
如果我们需要调用给定字符串名称的函数并且该函数在不同的模块中定义,则首先必须导入该模块。
import example_module
func = getattr(example_module, 'example_function')
print(func('ab', 'cd')) # ?️ 'abcd'
代码示例假定在同一目录中有一个名为 example_module 的模块。
example_module.py
def example_function(a, b): return a + b
一旦我们有了定义导入函数的模块,我们就可以使用 getattr() 函数通过字符串名称获取函数。
getattr 函数返回对象提供的属性的值。
该函数采用以下参数:
- object 应检索其属性的对象
- name 命名属性的名称
- default 对象上不存在该属性时的默认值
getattr() 函数将返回该函数,因此最后一步是调用它并提供所有必需的参数。
import example_module
func = getattr(example_module, 'example_function')
print(func('ab', 'cd')) # ?️ 'abcd'
如果函数在同一个模块中定义,请使用 globals() 函数。
使用 globals() 通过字符串名称调用函数
通过字符串名称调用函数:
- 使用 globals() 函数获取包含当前作用域的全局变量的字典。
- 使用字符串作为字典键来获取函数。
- 调用函数。
def do_math(a, b):
return a + b
func = globals()['do_math']
print(func(10, 5)) # ?️ 15
globals() 函数返回一个实现当前模块命名空间的字典。
def do_math(a, b):
return a + b
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f151f799de0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/borislav/Desktop/bobbyhadz_python/main.py', '__cached__': None, 'do_math': <function do_math at 0x7f151f8e3d90>}
print(globals())
我们可以使用字符串来访问字典中的特定键。
有一个带有函数名称的键指向实际函数。
如果模块中不存在具有给定名称的函数,则会出现 KeyError 异常。
最后一步是使用括号调用函数,为其提供所需的任何参数。
或者,我们可以定义一个将函数名称映射到实际函数的字典。
def do_math(a, b):
return a + b
functions_dict = {
'do_math': do_math,
}
function_name = 'do_math'
if function_name in functions_dict:
# ?️ 15
print(functions_dict[function_name](10, 5))
functions_dict 字典将函数名称作为键,将实际函数作为值。
If if 语句在调用函数之前检查指定的字符串是否存在于字典中。
如果需要通过字符串名称调用类方法,可以使用 getattr() 函数。
在 Python 中通过字符串名称调用方法
通过字符串名称调用方法:
- 实例化类以获取对象。
- 使用 getattr() 函数来访问该方法。
- 调用方法。
class Employee():
def __init__(self, first, last):
self.first = first
self.last = last
def get_name(self):
return self.first + ' ' + self.last
cls = globals()['Employee']
emp1 = cls('fql', 'zadmei')
func = getattr(emp1, 'get_name')
print(func()) # ?️ fql zadmei
如果我们必须从另一个类方法中通过字符串名称调用方法,我们可以将 self 作为第一个参数传递给 getattr() 函数。
如果该类是在不同的模块中定义的,则必须导入它。
我们可以直接导入类或使用 importlib.import_module() 方法。
这是一个直接导入类并通过字符串名称调用方法的示例。
import example_module
cls = getattr(example_module, 'Employee')
emp1 = cls('fql', 'zadmei')
func = getattr(emp1, 'get_name')
print(func()) # ?️ fql zadmei
代码示例假定在同一目录中有一个名为 example_module 的模块。
class Employee():
def __init__(self, first, last):
self.first = first
self.last = last
def get_name(self):
return self.first + ' ' + self.last
我们使用 getattr() 函数获取类,然后使用该函数获取方法。
最后一步是调用该方法。
这是一个使用 importlib.import_module() 方法在调用给定字符串名称的特定方法之前导入模块的示例。
import importlib
module = importlib.import_module('example_module')
cls = getattr(module, 'Employee')
emp1 = cls('fql', 'zadmei')
func = getattr(emp1, 'get_name')
print(func()) # ?️ fql zadmei
代码示例假定在同一目录中有一个名为 example_module 的模块,并且该模块定义了一个 Employee 类。
importlib.import_module 方法采用模块的名称并导入它。
name 参数可以是绝对的或相对的,例如 pkg.module 或 ..module 。
如果我们使用相对包名称,例如 ..module,我们必须将第二个参数传递给 import_module() 方法,例如 import_module(‘..module’, pkg.subpkg’) 导入 pkg.module。