【问题标题】:Variable naming of instances in PythonPython中实例的变量命名
【发布时间】:2015-08-17 06:25:40
【问题描述】:

我想做以下事情:

f = SomeClass()
something(f.name) = deepcopy(f)

所以当 f.name == 'ABC' 我有一个名为 ABC 的 SomeClass() 实例。

我需要它做什么?我想循环遍历一个列表,列表的每个元素都应该是 SomeClass() 的一个实例,但具有在实例化期间生成的特定名称。

【问题讨论】:

  • 你想用那个特定的名字做什么?
  • __str__(self) 方法中“构造”这样一个名称。
  • 我不清楚您是要设置实例的name 属性,还是要命名变量?

标签: python class dynamic instance naming


【解决方案1】:

你需要一个字典,里面存储key:value对,key可以是name,value可以直接是instance。您还需要注意字典中的 keys 是唯一的,因此如果您尝试为字典中已存在的键设置值,它将覆盖以前的值。

例子-

>>> class CA:
...     def __init__(self, name):
...             self.name = name
...
>>> classdict = {}
>>> classdict['abcd'] = CA('abcd')
>>> classdict['bcde'] = CA('bcde')
>>> classdict
{'abcd': <__main__.CA object at 0x02265150>, 'bcde': <__main__.CA object at 0x02265250>}
>>> for key in classdict:
...     print(classdict[key].name)
...
abcd
bcde

【讨论】:

  • 您也可以将实例存储在列表中;每个元素都会知道它的 name 属性。
  • 是的,但您将无法使用name 属性访问该元素。虽然问题中没有特别提出这个问题,但我猜这是一个要求,因为他想做类似 - something(f.name) = &lt;something&gt; 的事情。
  • 我认为这不是问题的要求。 OP 似乎只是希望每个实例都有一个单独的 name 属性。
  • 另外,在这种情况下,我没有看到使用列表而不是字典的任何好处,两者可能相同。
【解决方案2】:

您可以通过修改locals()globals()返回的范围字典来做到这一点:

from copy import deepcopy

class SomeClass:
    def __init__(self, name):
        self.name = name

f = SomeClass('ABC')

locals()[f.name] = deepcopy(f)

print(ABC)

我必须指出,在大多数情况下这是不好的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多