在 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', 'jiyik') func = getattr(emp1, 'get_name') print(func()) # 👉️ fql jiyik
如果我们需要调用给定字符串名称的函数并且该函数在不同的模块中定义,则首先必须导入该模块。
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', 'jiyik')
func = getattr(emp1, 'get_name')
print(func()) # 👉️ fql jiyik
如果我们必须从另一个类方法中通过字符串名称调用方法,我们可以将
self
作为第一个参数传递给getattr()
函数。
如果该类是在不同的模块中定义的,则必须导入它。
我们可以直接导入类或使用 importlib.import_module()
方法。
这是一个直接导入类并通过字符串名称调用方法的示例。
import example_module
cls = getattr(example_module, 'Employee')
emp1 = cls('fql', 'jiyik')
func = getattr(emp1, 'get_name')
print(func()) # 👉️ fql jiyik
代码示例假定在同一目录中有一个名为 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', 'jiyik')
func = getattr(emp1, 'get_name')
print(func()) # 👉️ fql jiyik
代码示例假定在同一目录中有一个名为 example_module
的模块,并且该模块定义了一个 Employee
类。
importlib.import_module
方法采用模块的名称并导入它。
name 参数可以是绝对的或相对的,例如 pkg.module 或 ..module 。
如果我们使用相对包名称,例如 ..module,我们必须将第二个参数传递给 import_module()
方法,例如 import_module('..module', pkg.subpkg')
导入 pkg.module
。
相关文章
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串
在 Python Pandas 中使用 str.split 将字符串拆分为两个列表列
发布时间:2024/04/24 浏览次数:1124 分类:Python
-
本教程介绍如何使用 pandas str.split() 函数将字符串拆分为两个列表列。
在 Pandas 中将 Timedelta 转换为 Int
发布时间:2024/04/23 浏览次数:231 分类:Python
-
可以使用 Pandas 中的 dt 属性将 timedelta 转换为整数。
Python 中的 Pandas 插入方法
发布时间:2024/04/23 浏览次数:112 分类:Python
-
本教程介绍了如何在 Pandas DataFrame 中使用 insert 方法在 DataFrame 中插入一列。
使用 Python 将 Pandas DataFrame 保存为 HTML
发布时间:2024/04/21 浏览次数:106 分类:Python
-
本教程演示如何将 Pandas DataFrame 转换为 Python 中的 HTML 表格。
如何将 Python 字典转换为 Pandas DataFrame
发布时间:2024/04/20 浏览次数:73 分类:Python
-
本教程演示如何将 python 字典转换为 Pandas DataFrame,例如使用 Pandas DataFrame 构造函数或 from_dict 方法。
如何在 Pandas 中将 DataFrame 列转换为日期时间
发布时间:2024/04/20 浏览次数:101 分类:Python
-
本文介绍如何将 Pandas DataFrame 列转换为 Python 日期时间。