Python: 'self' 无法订阅

Python: 'self' is unsubscriptable

我有一个带有多个字典变量的 class。有没有办法设置 class 变量的字典参数,其中变量名在函数中作为字符串传递?

<?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 时抛出错误说明:“'self' 是不可订阅的”。如果我执行代码,我会收到错误消息:“TypeError: 'Test' object is not subscriptable”。

解决此问题的一种方法是使用 'getattr':

创建一个临时变量
    def set_variable(self, var_name, value):
        temp = getattr(self, var_name)
        temp["value"] = value
        setattr(self, var_name, temp)

但是,我发现上面的解决方案增加了内存使用量,尤其是对于更大的词典。

此外,我想在很多地方使用 self[var_name]。有办法吗?

setattr(self, var_name, temp) 不需要,因为您正在修改原始词典(您只是暂时将其命名为 temp)。这里它本质上是一个空操作(你正在设置你读过的字典的相同地址)。所以内存使用量很小,不依赖于你的词典有多大。

所以您接近的解决方案是:

def set_variable(self, var_name, value):
    getattr(self, var_name)["value"] = value

你可以使用 self.__dict__[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}