如何通过字典修改Python类实例成员变量?代码修改无效求方案
问题原因
你当前的代码里,slotDictionary存储的是self.slot1到self.slot5的字符串值副本——因为Python的字符串是不可变类型,当你把self.slot1存入字典时,实际存的是当时空字符串的值,而非对self.slot1这个属性的引用。所以修改字典里的元素,只会改变字典本身的内容,不会同步到类实例的属性上。
解决方法
方法1:通过属性名字符串+setattr修改
把字典的value设为属性的名称字符串,然后用setattr()函数直接修改实例属性:
class Solution(object): def __init__(self): self.slot1 = "" self.slot2 = "" self.slot3 = "" self.slot4 = "" self.slot5 = "" # 存储属性名称而非属性值 self.slotDictionary = {1: "slot1", 2: "slot2", 3: "slot3", 4: "slot4", 5: "slot5"} def checkAnswer(self): choice = int(input("What is the answer?")) # 用setattr修改对应属性 setattr(self, self.slotDictionary[choice], "something") solution = Solution() solution.checkAnswer() # 验证:输入1后,print(solution.slot1)会输出"something"
方法2:用可变对象包装属性值
可变类型(比如列表)在字典中存储的是引用,修改可变对象的内容会同步到原属性。可以把每个slot改成列表类型:
class Solution(object): def __init__(self): # 用列表包装值,列表是可变类型 self.slot1 = [""] self.slot2 = [""] self.slot3 = [""] self.slot4 = [""] self.slot5 = [""] self.slotDictionary = {1: self.slot1, 2: self.slot2, 3: self.slot3, 4: self.slot4, 5: self.slot5} def checkAnswer(self): choice = int(input("What is the answer?")) # 修改列表的第一个元素,会同步到原属性 self.slotDictionary[choice][0] = "something" solution = Solution() solution.checkAnswer() # 验证:输入1后,print(solution.slot1[0])会输出"something"
方法3:直接操作实例的__dict__(不推荐但可行)
Python实例的属性存储在__dict__字典中,你可以直接利用这个特性,不需要额外定义slotDictionary:
class Solution(object): def __init__(self): self.slot1 = "" self.slot2 = "" self.slot3 = "" self.slot4 = "" self.slot5 = "" def checkAnswer(self): choice = int(input("What is the answer?")) # 直接通过__dict__修改属性,key是属性名的字符串 self.__dict__[f"slot{choice}"] = "something" solution = Solution() solution.checkAnswer()
内容的提问来源于stack exchange,提问作者Massimo Genna
相关产品推荐
相关产品推荐

