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

Python类间变量传递更新问题及AttributeError报错咨询

类与实例属性操作的问题解析

问题背景与代码

我尝试在不同类之间传递变量,创建了名为declaration的信息类,代码如下:

class declaration():
    def __init__(self):
        self.info1 = 999
        self.info2 = 'something_else'
        print ('At declaration ')

class controller():
    def __init__(self):
        instance = declaration()
        print ('Initial number ',instance.info1, instance.info2)
        modifier(declaration)
        print ('MIDDLE ',instance.info1,declaration.info1)
        instance = declaration()
        print ('Final number ',instance.info1)

class modifier():
    def __init__(self,aux):
        print ('MODIFIER')
        self.info=aux
        self.info.info1=55555

controller()

运行输出:

At declaration
Initial number  999 something_else
MODIFIER
MIDDLE 999 55555
At declaration
Final number  999

我有两个疑问:

  1. 把modifier类修改为以下代码时:
class modifier():
    def __init__(self,aux):
        self.info=aux
        print ('MODIFIER',self.info.info1)
        self.info.info1=55555

会触发错误AttributeError: type object 'declaration' has no attribute 'info1',交换最后两行就能修复,搞不懂类属性是不是没传递或者需要重新初始化;
2. 类已经更新的情况下,怎么更新对应的实例?第二次调用instance = declaration()看起来没效果。


问题解答

问题1:修改modifier后触发属性错误的原因

核心是混淆了类对象和实例对象的区别:

  • declaration是类本身,instance = declaration()创建的是这个类的实例。你在controller里传给modifier的是declaration类,不是它的实例。
  • 原始代码里self.info.info1=55555这行,实际是给类对象declaration新增了一个类属性info1,而非操作实例属性。
  • 修改后的代码先打印self.info.info1,此时类declaration还没有info1这个类属性——info1原本是实例属性,只有实例初始化时才会在实例自身上创建,类本身没有这个属性,所以报错。
  • 交换最后两行后,先给类declaration添加了info1类属性,再打印自然就不会报错了。

问题2:让实例同步类更新的方法

首先要明确两个关键点:

  • 给类添加类属性后,后续创建的实例会继承这个类属性,但如果实例自己已经有同名的实例属性,会优先使用实例自身的属性。
  • 你第二次调用instance = declaration()时,__init__方法里又给新实例绑定了self.info1=999这个实例属性,它会覆盖继承来的类属性info1=55555,所以打印结果还是999。

如果想实现实例同步类属性的变化,有两种可行思路:

  1. 直接使用类属性而非实例属性
    修改declaration类,把info1和info2定义为类属性:

    class declaration():
        info1 = 999
        info2 = 'something_else'
        def __init__(self):
            print ('At declaration ')
    

    这样所有实例访问info1时,都会直接使用类属性的值,修改类属性后,所有实例(包括已创建的)都会拿到最新值。

  2. 手动同步类属性到实例
    如果必须保留实例属性,可以在需要更新时,手动将类属性的值同步到实例:

    # 比如在controller里修改
    instance.info1 = declaration.info1
    

    这样就能让实例的属性值和类属性保持一致。


内容的提问来源于stack exchange,提问作者afernandezody

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:36:13