迹忆客 专注技术分享

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

在 Python 中将字符串转换为 Class 对象

作者:迹忆客 最近更新:2022/11/11 浏览次数:

要将字符串转换为类对象:

  1. 使用 sys.modules 字典获取当前模块。
  2. 可以在模块的属性中访问该类。
  3. 将字符串传递给 getattr() 函数以获取类对象。
import sys


class Employee():
    pass


def get_class(class_name):
    return getattr(sys.modules[__name__], class_name)


cls = get_class('Employee')
print(cls)  # 👉️ <class '__main__.Employee'>

该示例假定该类是在同一模块中定义的。 如果该类是在不同的模块中定义的,请向下滚动到最后一个子标题并使用 importlib.import_module() 方法。

Sys.modules 是一个字典,将模块名称映射到已经加载的模块。

__name__ 全局变量存储模块的名称。

import sys

# 👇️ <module '__main__' from '/Users/jiyik/workspace/python/study/main.py'>
print(sys.modules[__name__])

python __name__ 全局变量存储模块的名称

获得模块对象后,使用 getattr() 方法将字符串转换为类对象。

import sys


class Employee():
    pass


def get_class(class_name):
    return getattr(sys.modules[__name__], class_name)


cls = get_class('Employee')
print(cls)  # 👉️ <class '__main__.Employee'>

getattr 函数返回对象提供的属性的值。

该函数采用以下参数:

  • object 应检索其属性的对象
  • name 命名属性的名称
  • default 对象上不存在该属性时的默认值

如果具有指定名称的类不存在,我们将收到 AttributeError

如果需要指定默认值,可以将第三个参数传递给 getattr() 方法。

import sys


def get_class(class_name):
    # 👇️ returns None if class with given name doesn't exist
    return getattr(sys.modules[__name__], class_name, None)


cls = get_class('ABC123')
print(cls)  # 👉️ None

或者,我们可以使用 eval() 函数。


使用 eval() 将字符串转换为 Class 对象

使用 eval() 函数将字符串转换为类对象,例如 eval(class_name)eval() 函数将获取字符串并将其作为返回类的 Python 表达式求值。

class Employee():
    pass

def get_class(class_name):
    return eval(class_name)


print(get_class('Employee'))  # 👉️ <class '__main__.Employee'>

python eval() 将字符串转换为 Class 对象

eval() 函数接受一个表达式,将其解析并评估为 Python 表达式,使用 globalslocals 字典作为全局和本地命名空间。

eval() 函数只能用于受信任的代码。 不要将 eval() 用于用户生成的数据。

eval() 函数基本上试图运行给定的表达式,所以它不应该与不受信任的代码一起使用。

如果在使用 eval() 时出现 linting 错误,请改用 globals() 字典。


使用 globals() 将字符串转换为 Class 对象

要将字符串转换为类对象:

  1. 使用 globals() 函数获取包含当前作用域的全局变量的字典。
  2. 使用字符串作为字典键来访问类对象。
# ✅ if the class is in the same module

class Employee():
    pass

def get_class(class_name):
    return globals()[class_name]


print(get_class('Employee'))  # 👉️ <class '__main__.Employee'>

python globals() 将字符串转换为 Class 对象

globals() 函数返回一个实现当前模块命名空间的字典。

class Employee():
    pass

# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10a24e810>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/jiyik/workspace/python/study/main.py', '__cached__': None, 'Employee': <class '__main__.Employee'>}
print(globals())

最后一步是使用字符串来访问字典的键。

有一个带有类名的键指向类对象。

如果模块中不存在具有给定名称的类,则会出现 KeyError 异常。

前 3 种方法仅适用于在同一模块中定义类的情况。

如果该类是在不同的模块中定义的,请使用 importlib 模块。

使用 importlib.import_module() 将字符串转换为 Class 对象

当类在不同的模块中定义时,将字符串转换为类对象:

  1. 使用 importlib.import_module() 方法导入模块。
  2. 可以在模块的属性中访问该类。
  3. 将字符串传递给 getattr() 函数以获取类对象。
import importlib


def get_class(module_name, class_name):
    module = importlib.import_module(module_name)
    return getattr(module, class_name)


print(get_class('another', 'Employee'))  # 👉️ <class 'another.Employee'>

该示例假定在包含 Employee 类的同一目录中存在一个名为 another.py 的模块。

another.py

class Employee():
    pass

python 使用 importlib import_module() 将字符串转换为 Class 对象

importlib.import_module() 方法采用模块的名称并导入它。

name 参数可以是绝对的或相对的,例如 pkg.module..module

如果您使用相对包名称,例如 ..module,我们必须将第二个参数传递给 import_module() 方法,例如 import_module('..module', pkg.subpkg') 导入 pkg.module。

一旦我们导入了模块,我们就可以使用 getattr() 函数从给定的字符串中获取类对象。

getattr() 函数采用可选的第三个参数,该参数用作对象上不存在该属性时的默认值。

转载请发邮件至 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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便