迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

在 Python 中通过字符串名称调用函数

作者:迹忆客 最近更新:2023/04/09 浏览次数:

通过字符串名称调用函数:

  1. 导入定义函数的模块。
  2. 使用 getattr() 函数获取函数。
  3. 调用函数。

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() 通过字符串名称调用函数

通过字符串名称调用函数:

  1. 使用 globals() 函数获取包含当前作用域的全局变量的字典。
  2. 使用字符串作为字典键来获取函数。
  3. 调用函数。
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())

python 打印全局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 中通过字符串名称调用方法

通过字符串名称调用方法:

  1. 实例化类以获取对象。
  2. 使用 getattr() 函数来访问该方法。
  3. 调用方法。
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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python for 循环中的下一项

发布时间:2023/04/26 浏览次数:179 分类:Python

本文讨论了 Python 中的 for 循环以及如何通过使用 for 循环和示例来跳过列表的第一个元素。

Python While 循环用户输入

发布时间:2023/04/26 浏览次数:148 分类:Python

我们可以在 while 循环中使用 input() 函数来输入数据,直到在 Python 中满足某个条件。

Python 中的整数规划

发布时间:2023/04/26 浏览次数:193 分类:Python

本文介绍了整数规划和可用于解决混合整数规划问题的 Python 工具。

在 Python 中将整数转换为罗马数字

发布时间:2023/04/26 浏览次数:87 分类:Python

本篇文章将介绍在 Python 中将整数转换为罗马数字。以下是一个 Python 程序的实现,它将给定的整数转换为其等效的罗马数字。

在 Python 中将罗马数字转换为整数

发布时间:2023/04/26 浏览次数:144 分类:Python

本文讨论如何在 Python 中将罗马数字转换为整数。 我们将使用 Python if 语句来执行此操作。 我们还将探讨在 Python 中将罗马数字更改为整数的更多方法。

在 Python 中读取 gzip 文件

发布时间:2023/04/26 浏览次数:70 分类:Python

本篇文章强调了压缩文件的重要性,并演示了如何在 Python 中使用 gzip 进行压缩和解压缩。

在 Python 中锁定文件

发布时间:2023/04/26 浏览次数:141 分类:Python

本文解释了为什么在 Python 中锁定文件很重要。 这讨论了当两个进程在没有锁的情况下与共享资源交互时会发生什么的示例,为什么在放置锁之前知道文件状态很重要,等等

在 Python 中将 PDF 转换为文本

发布时间:2023/04/26 浏览次数:196 分类:Python

在本教程中,我们将学习如何使用 Python 使用 PyPDF2、Aspose 和 PDFminer 将 PDF 文档转换为文本文件。

在 Python 中创建临时文件

发布时间:2023/04/26 浏览次数:53 分类:Python

本文讲解了tempfile库函数的四个子函数:TemporaryFile、NamedTemporaryFile、mkstemp、TemporaryDirectory。 每个部分都提供了适当的程序,以简化对概念的理解。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便