【问题标题】:How to instantiate class by it's string name in Python from CURRENT file? [duplicate]如何通过当前文件中的 Python 中的字符串名称实例化类? [复制]
【发布时间】:2020-07-24 02:44:50
【问题描述】:

假设我有myfile.py 和一些类ABC 在里面定义。现在我想通过它在 str 中的名称来实例化类。我不明白要传递给getattr 什么才能做到这一点。所有examples like this 都假定类在其他模块中:

module = __import__(module_name)
class_ = getattr(module, class_name)
instance = class_()

但我没有module_name

【问题讨论】:

  • 不认为这是好的做法,但是x = globals()['Foo']()

标签: python python-3.x reflection


【解决方案1】:

如果您在定义它们的同一模块上,您可以调用globals(),并简单地使用类名作为返回字典的键:

例如。我的模块.py

class A: ...
class B: ...
class C: ...

def factory(classname):
    cls = globals()[classname]
    return cls()

如果您从另一个文件导入类,上述解决方案也可以使用

否则,您可以简单地将模块本身导入您的函数中,然后使用 getattr(这样做的好处是您可以将此工厂函数重构为任何其他模块而无需更改):

def factory(classname):
     from myproject import mymodule
     cls = getattr(mymodule, classname)
     return cls()

【讨论】:

  • 我不想硬编码myprojectmymodule,它应该是当前文件
  • 所以,上面也回答了 - 只需使用globals()。没有缺点,它记录了行为和语言规范的一部分。
  • 某人-(IIRC @coddy)刚刚编辑了这个答案,增​​加了两行,暗示了另一种完成任务的方式。据我所知,上述建议是并且 uon尝试它,显然是不正确的。恳求,如果您有新的方法来回答问题,请在您的用户的新答案中这样做。欢迎进行修改以改进语法和格式。
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多