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

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

Convert a string to a Class object in Python

将字符串转换为类对象:

  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 '/home/borislav/Desktop/bobbyhadz_python/main.py'> print(sys.modules[__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函数返回对象提供的属性的值。

该函数采用以下参数:

姓名 描述
目的 应检索其属性的对象
姓名 属性的名称
默认 对象上不存在该属性时的默认值

如果具有指定名称的类不存在,你会得到一个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() 将字符串转换为类对象

使用该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'>

eval函数接受一个表达式,解析它并将其作为 Python 表达式求值,使用
globalslocals字典作为全局和局部名称空间。

eval()函数只能与受信任的代码一起使用。不要eval()与用户生成的数据一起使用。

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

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

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

将字符串转换为类对象:

  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'>

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

主程序
class Employee(): pass # {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f851caa1de0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/borislav/Desktop/bobbyhadz_python/main.py', '__cached__': None, 'Employee': <class '__main__.Employee'>} print(globals())

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

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

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

前 3 种方法仅在类定义在同一模块中时才有效。

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

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

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

  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'>

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

另一个.py
class Employee(): pass

importlib.import_module

方法采用模块的名称并将其导入

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

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

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

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