Python中是否可在一个类中修改另一类__init__定义的实例属性
结论
你的需求完全可以实现,不需要额外编写专门的处理函数。你给出的极简示例代码逻辑本身是正确的,只要操作的是同一个A类实例,修改后的值会永久保存在实例中,后续所有访问都会拿到修改后的结果。
常见修改不生效的原因
你遇到的修改仅单次生效的问题,基本是实际代码中存在以下几种错误导致的:
- 每次操作都重新生成了A的实例:比如在B的其他函数中重新执行了
self._A = A(xxx),或者每次调用相关逻辑都新建了B的实例,相当于每次都用初始值重新初始化了A对象,之前的修改自然不会保留。 - 误修改局部变量而非实例变量:你示例中
number = self._A.number拿到的是int类型的值副本,后续如果只修改number变量本身不会影响self._A.number,必须直接操作self._A.number才会生效。字典属于可变对象,直接修改dictionary的键值会同步到self._A.dictionary,但如果执行了dictionary = {}这类重新赋值操作,也只会修改局部变量,不会影响实例属性。 - 缺少坐标偏移逻辑:你提到想要字典变成
{(6, 0): 'a', (7,0): 'b'},这个效果仅修改self._A.number无法实现,需要额外编写逻辑遍历原字典的坐标键,给x坐标加上偏移量后更新字典。
可正常运行的参考实现
class A(): def __init__(self, number): self.number = number # 本示例中number初始值为5 self.dictionary = {(1, 0): 'a', (2,0): 'b'} class B(): # 注意B不继承A def __init__(self, number): self._number = number self._A = A(self._number) self.screen_width = 10 # 按你的游戏实际网格宽度设置即可 def do_stuff(self) -> None: # 要求该函数无返回值 # 修改number属性 self._A.number += 5 # 实体整体右移5位的逻辑 new_dict = {} offset = 5 for (x, y), val in self._A.dictionary.items(): # 取模实现超出边界后绕到屏幕另一侧 new_x = (x + offset) % self.screen_width new_dict[(new_x, y)] = val self._A.dictionary = new_dict def check_a_attr(self): print(f"number值:{self._A.number}") print(f"坐标字典:{self._A.dictionary}") # 测试逻辑,全程使用同一个B实例 b = B(5) print("修改前:") b.check_a_attr() b.do_stuff() print("第一次修改后:") b.check_a_attr() b.do_stuff() print("第二次修改后:") b.check_a_attr()
上述代码运行结果如下,修改会永久生效:
修改前: number值:5 坐标字典:{(1, 0): 'a', (2, 0): 'b'} 第一次修改后: number值:10 坐标字典:{(6, 0): 'a', (7, 0): 'b'} 第二次修改后: number值:15 坐标字典:{(1, 0): 'a', (2, 0): 'b'} # 这里因为屏幕宽度是10,11%10=1、12%10=2,所以回到初始坐标
内容的提问来源于stack exchange,提问作者tauforta
相关产品推荐
相关产品推荐

