我正在尝试更改另一个类中与 Class3 关联的实例变量 var3(请参阅下面的代码)。
我在Class1的init中实例化了Class2和Class3。
然后我将属于 Class3 的 var3 发送到 Class2,Class2 会向 var3 追加一个字符串。
但是当我去打印实例变量 var3 (class1.class3.var3) 时,该变量没有按预期更改,它没有被附加到并且仍然只是“class3”。
我正在寻找不同的答案:
这段代码并不用于任何关键的事情,我只是想进一步加深我的理解。这个想法是使用基类(Class1)将 PyQt 应用程序中的所有类粘合在一起,在各个类之间和内部流畅地传递和更改实例变量。
谢谢!!
class Class1:
var = "class1"
def __init__(self):
self.class2 = Class2()
self.class3 = Class3()
def class2_to_class3(self):
self.class2.change_class3_var(self.class3.var3)
class Class2:
var2 = "class2"
def change_class3_var(self, instance_var):
instance_var += " appended by class2"
print(instance_var)
class Class3:
var3 = "class3"
class1 = Class1()
class1.class2_to_class3()
print(class1.class3.var3)
像这样编写代码可以按需要工作,但我可能并不总是想使用静态或类方法装饰器(见下文),即,我可能想在同一方法中使用实例 self。
class Class1:
var = "class1"
def class2_to_class3(self):
Class2.from_class3(Class3)
class Class2:
var2 = "class2"
@staticmethod
def from_class3(cls):
cls.var3 += " appended by class2"
print(cls.var3)
return
class Class3:
var3 = "class3"
def hello(self):
print("hello from class 3")
class1 = Class1()
class1.class2_to_class3()
print(Class3.var3)
这也有效,但我不太喜欢在 Class1“外部”实例化类的方式。另外,我不喜欢这样一个事实:如果我要求 VScode 从 def from_cass3 中转到 var3 的定义,它无法缩放到 var 3 的位置,因为它正在寻找 instance.var3 而不是 class3.var3。
class Class1:
var = "class1"
def class2_to_class3(self):
class2.from_class3(class3)
class Class2:
var2 = "class2"
def from_class3(self, instance):
instance.var3 += " appended by class2"
class Class3:
var3 = "class3"
class1 = Class1()
class2 = Class2()
class3 = Class3()
print(class3.var3)
class1.class2_to_class3()
print(class3.var3)
本质上,字符串是不可变的,这意味着它们一旦创建就无法更改。在您的代码的这一部分中:
instance_var += " 由 class2 附加"
您正在将字符串添加到局部变量instance_var。字符串不是唯一不可变的对象,元组也是如此(这是元组和列表之间的区别)。您的尝试仅适用于可变对象,例如数字或列表。或不可变对象,因为您无法就地修改它们,所以您需要一种方法来更新原始对象中的引用。
至于为什么这是一个坏主意,你正在耦合你的类。这使得类的模块化程度降低并且更难维护。您还模糊了数据流,使得很难跟踪数据被修改的位置。好的类设计使用封装,这意味着每个类负责管理自己的状态。