Jam*_*ony 0 python dictionary self class-variables
我有一个包含多个字典变量的类。有没有办法设置类变量的字典参数,其中变量名在函数中作为字符串传递?
<?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)
Run Code Online (Sandbox Code Playgroud)
在编码时,linter 会抛出错误,指出:“‘self’不可订阅”。如果执行代码,我会收到错误:“TypeError:'Test'对象不可下标”。
解决此问题的一种方法是使用“getattr”创建临时变量:
def set_variable(self, var_name, value):
temp = getattr(self, var_name)
temp["value"] = value
setattr(self, var_name, temp)
Run Code Online (Sandbox Code Playgroud)
但是,我发现上面的解决方案增加了内存使用量,特别是对于更大的字典来说是一个丑陋的解决方案。
另外,我想在很多地方使用 self[var_name] 。有没有办法做到这一点?
虽然 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}
Run Code Online (Sandbox Code Playgroud)