【问题标题】:Convert list of strings into objects将字符串列表转换为对象
【发布时间】:2015-02-25 06:26:16
【问题描述】:

我有一个字符串列表,比如:

listofstuff = ['string1', 'string2', 'string3', ...]

我已经为我想做的事情创建了一个自定义类对象。我现在想要的是创建一堆在我的列表中命名为字符串的对象。我该怎么做?

所以我有类似的东西:

for object in listofstuff:
     object = classthing(inputs)

但它不起作用。我该怎么做?

编辑:也许我应该澄清一下。我有一个可以更改的输入文件,并且在所述输入文件中是一个名称列表。我想创建一堆类对象,它们都被称为列表中的名称。

所以有人给了我一个类似的列表 东西= ['car1','car2','car3'] 我现在想创建一堆新的 Car 对象,每个对象都称为 car1、car2 等。这样以后我就可以做 car1.calculate_price() 之类的事情了。

编辑 2:抱歉所有的编辑,但我也想分享一些东西。在我想做的事情中,对象以特定的方式组合在一起,但这些方式对用户来说并不明显。所以它就像'car1_car23_car4'。所以我想,如果我问用户,你想选哪辆车?他们选择了 car4,它会创建一个名为 car1_car23_car4 的对象,而不是 car4。

【问题讨论】:

  • 你想要什么?想要重新定义该列表中的每个元素?
  • 你能发布对象的__init__ 方法吗?

标签: python list dynamic-variables


【解决方案1】:

动态创建名称不是正确的方法。很容易忘记它们,比您需要的多或少,或者不小心覆盖现有名称。

更好的方法是制作一个字典,其中键是来自listofstrings 的字符串,值是类的实例。您可以使用dict comprehension 并编写如下内容:

dct = {name: classthing(inputs) for name in listofstuff}

下面是一个演示1它的作用:

>>> class classthing: # This represents your class
...     def __init__(self, name):
...         self.name = name
...
>>> listofstuff = ['Joe', 'Bob', 'Mary']
>>>
>>> dct = {name: classthing(name) for name in listofstuff}
>>> dct  # dct now holds all the data you need
{'Mary': <__main__.classthing object at 0x0205A6D0>, 'Joe': <__main__.classthing object at 0x0205A690>, 'Bob': <__main__.classthing object at 0x0205A6B0>}
>>>
>>> # Each value in dct is an individual instance of your class
>>> dct['Joe'].name
'Joe'
>>> dct['Bob'].name
'Bob'
>>> dct['Mary'].name
'Mary'
>>>

1为了演示,我把inputs换成了name。不过,您不必在真实代码中执行此操作。

【讨论】:

  • 我认为这可能是正确的方法,但我不是动态创建名称列表或以某种我可能会忘记的方式创建名称列表。我有一个包含名称列表的输入文件,我想将此列表中的名称转换为称为所述名称的对象。有什么办法吗?
  • 动态创建名称。你可以通过像globals()[object] = classthing(inputs)一样更新globals()来做到这一点,但这不是很优雅并且容易出错。
  • 对不起,我在上面的问题中澄清了一点。我知道这不是那么优雅,对不起,我是一个新手,因为工作而被投入其中。您的方式似乎我也可以做我需要做的事情,但是我要问的原因现在在上面。感谢您的帮助!
【解决方案2】:

假设您的字符串位于名为 listofstrings 的列表中,这将创建一个从字符串构造对象的对应列表(还假设该类的 __init__ 方法需要一个字符串参数):

listofobjects = [classthing(s) for s in listofstrings]

如果您正在寻找,请进一步阅读list comprehensions

虽然这回答了您的问题,但 other answer 可能是更好的方法。

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2017-11-10
    • 2016-06-24
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多