gpt4 book ai didi

python - 如何通过 package_name.module_name.class_name "path"实例化类

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:16 24 4
gpt4 key购买 nike

我想实现一些类似于 django fixture 系统的东西,在 fixture 中你设置 model 属性,它指示 fixture 的模型类。看起来像这样

my_app.models.my_model

我的问题是,为了创建该“路径”指向的类的实例,处理此类字符串的标准方法是什么。我认为它应该看起来像:

  1. 将其拆分为模块名和类名部分
  2. 加载模块(如果没有加载)
  3. 通过名称从模块中获取类
  4. 实例化

具体应该怎么做?

编辑:我想出了一个肮脏的解决方案:

def _resolve_class(self, class_path):
tokens = class_path.split('.')
class_name = tokens[-1]
module_name = '.'.join(tokens[:-1])
exec "from %s import %s" % (module_name, class_name)
class_obj = locals()[class_name]
return class_obj

这是它的工作,但是由于使用了 exec 和通过恶意准备固定装置来操纵执行的可能性,因此很脏。应该如何正确完成?

最佳答案

我经常使用 django 的 import_module 函数,因为它在框架周围使用来完成这个任务。

from django.utils.importlib import import_module

path = 'foo.bar.classname'
module_path, class_name = path.rsplit('.', 1)
module = import_module(module_path)
cls = getattr(module, class_name)() # instantiated!

至于您解决方案中的 exec,您可以通过在模块上使用 __import__ 轻松删除它,然后获取类。

关于python - 如何通过 package_name.module_name.class_name "path"实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com