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
我有两个疑问:
- 把
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。
如果想实现实例同步类属性的变化,有两种可行思路:
直接使用类属性而非实例属性
修改declaration类,把info1和info2定义为类属性:class declaration(): info1 = 999 info2 = 'something_else' def __init__(self): print ('At declaration ')这样所有实例访问
info1时,都会直接使用类属性的值,修改类属性后,所有实例(包括已创建的)都会拿到最新值。手动同步类属性到实例
如果必须保留实例属性,可以在需要更新时,手动将类属性的值同步到实例:# 比如在controller里修改 instance.info1 = declaration.info1这样就能让实例的属性值和类属性保持一致。
内容的提问来源于stack exchange,提问作者afernandezody
相关产品推荐
相关产品推荐

