【问题标题】:python create object from stringpython从字符串创建对象
【发布时间】:2015-08-19 16:24:41
【问题描述】:

我有下一个情况。以下方法的目标是返回从传入字符串创建的对象。所以我有:

class Situation(Generator):
    pass

以及父类内部的方法:

class Generator(object):
    def createsituation(self, stringsituation="situation"):
        return "Instance of Situation"

传入的字符串总是等于字符串“situation”。在python中可以吗?

【问题讨论】:

  • 你想生成任意类实例,还是只生成一小部分?
  • 那么,你想要一个有一个方法的类,给定一个传递的字符串,它将找到另一个名称与该字符串匹配的类,然后返回该匹配类的对象?
  • 抱歉 - 添加一些更正... Situation 是 Generator 的子级。生成器有一个接收字符串的方法。所以我希望字符串“situation”转换为 Situation()...
  • 如果这应该是通用的,为什么要调用方法createsituation 和参数stringsituation?如果它只有'situation',为什么要大惊小怪?!
  • 反正可能是 XY 问题。

标签: python string class


【解决方案1】:

您可以轻松地将字符串映射到类,是的。类只是更多的对象,您可以将它们存储在其他 Python 对象中。

您可以手动构建字典,将字符串映射到类:

classes = {'situation': Situation}

你可以通过创建一个类装饰器来稍微自动化一下,也许:

classes = {}
def register(cls):
    classes[cls.__name__.lower()] = cls
    return cls

@register
class Situation(Generator):
    # ...

您以@register 为前缀的每个类都将被添加到字典中,类名小写作为键。

或者您可以使用globals() function 获取模块中all 全局变量的字典。后者有点……矫枉过正,而且还存在安全隐患,你最终可能会为最终用户提供比你预想的更多的访问权限,因为这也为他们提供了你不想公开的其他类和功能。

一旦你有了字典,只需访问正确的类并调用它:

class Generator(object):
    def createsituation(self, stringsituation="situation"):
        return classes[stringsituation]()

【讨论】:

  • 太棒了。这就是我想要的)))
【解决方案2】:

如果我理解正确的话,您想从 Generator 的 createituation 方法创建 Situation 对象。因此,您需要在 Situation 类中使用适当的构造函数,并将传递的字符串作为参数。对您的代码稍作改动即可实现这一目标:

class Situation(object):
    def __init__(self, string):
        print string

class Generator(object):
    def createsituation(self, stringsituation="situation"):
        return Situation(stringsituation)

g = Generator()
sitObj = g.createsituation("new_situation") # prints "new_situation" from Situation constructor

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2010-10-15
    • 1970-01-01
    • 2015-09-08
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多