Python __setitem__ 类变量

0 投票
3 回答
835 浏览
提问于 2025-04-21 04:36

我正在尝试创建一个包含一些变量的类。

def __setitem__(self, item, value):
    switch = {
        "hour" : self.hour,
        "minute" : self.minute,
        "second" : self.second,
        "day" : self.day,
        "dennidoby" : self.dennidoby,
        "season" : self.season,
        "month" : self.month,
        "year" : self.year,
        "dayr" : self.dayr,
        "dennitepl" : self.dennitepl,
        "pocasitepl" : self.pocasitepl,
        "wheather" : self.wheather,
        "temperature" : self.temperature,
        "obdobi" : self.obdobi,
        "den" : self.den,
        "mesic" : self.mesic
        }
    switch[item] = value

我用以下代码来调用:

cas["wheather"] = "storm"

但是:

switch[item] = value

在对象中设置变量时不起作用。

3 个回答

2

每次你调用 __setitem__ 的时候,其实是在创建一个新的字典,叫做 switch。然后你用 switch[item] = value 来更新这个字典。看起来 switch 和实例 self 没有任何关系。如果你想让你的类的实例拥有这些键值对,并且还想用 __setitem__ 来更新的话,我建议你可以这样做:

class Cas(object):

    def __init__(self):
    self._switch = { ... #what you had...}

    def __setitem__(self, item, value):
        self._switch[item] = value

    def __getitem__(self, item):
        return self._switch[item]

不过,从你分享的信息来看,直接使用一个 dict 或者创建一个 dict 的子类可能更合适。

2

你可以通过 setattr(item, value) 动态地改变一个属性的值。这样你的代码看起来会像这样:

def __setitem__(self, item, value):
    self.__setattr__(item, value)

这样就可以完成这个任务了。

3

其实不是这样的。switch是一个局部变量:当__setitem__这个方法执行完毕后,它就会被删除,下次你调用这个方法时,它会用你写死的值重新创建。

你应该把这个变量的初始值设置放到__init__方法里,并在__init____setitem__中都用self.switch来引用它。

撰写回答