You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:57:00