我有一个包含多个字典变量的类。有没有办法设置类变量的字典参数,其中变量名称作为函数中的字符串传递?
<?php
class Test:
var1 = { "value": 1 }
var2 = { "value": 2 }
def set_variable(self, var_name, value):
## self.var_name.value = value ### pylint: Instance of 'Test' has no 'var_name' member
self[var_name]["value"] = value ### pylint: 'self' is unsubscriptable ###
instance = Test()
instance.set_variable("var1", 150)
编码linter时会抛出错误说明:&#34; &#39;自&#39;是不可取消的&#34;。如果我执行代码,我会收到错误:&#34; TypeError:&#39;测试&#39;对象不是可订阅的&#34;。
解决此问题的一种方法是使用&#39; getattr&#39;创建临时变量:
def set_variable(self, var_name, value):
temp = getattr(self, var_name)
temp["value"] = value
setattr(self, var_name, temp)
但是,我发现上述内容是一种丑陋的解决方案,可以增加内存使用量,尤其是对于更大的字典。
另外,我想在很多地方使用self [var_name]。有没有办法做到这一点?
答案 0 :(得分:2)
虽然Python类是使用字典实现的,但您不能将它们视为开箱即用的字典。
self[var_name]
应为getattr(self, var_name)
。
如果您坚持使用[ ]
语法Test
应该实施__getitem__
:
class Test:
var1 = { "value": 1 }
var2 = { "value": 2 }
def set_variable(self, var_name, value):
self[var_name]["value"] = value
# or getattr(self, var_name)["value"] = value if not implementing __getitem__
def __getitem__(self, item):
return getattr(self, item)
instance = Test()
instance.set_variable("var1", 150)
print(instance.var1)
# {'value': 150}
答案 1 :(得分:0)
setattr(self, var_name, temp)
,因为您正在修改原始字典(您只需将其命名为temp
一段时间)。这里它本质上是一个无操作(你设置的是你读过的字典的相同地址)。因此,内存使用量很小,并不取决于字典的大小。
所以你接近的解决方案是:
def set_variable(self, var_name, value):
getattr(self, var_name)["value"] = value
答案 2 :(得分:0)
您可以使用self.__dict__[var_name]
做您想做的事。