Python中类的误区,访问和更改实例变量

问题描述 投票:0回答:1

我正在尝试更改另一个类中与 Class3 关联的实例变量 var3(请参阅下面的代码)。

我在Class1的init中实例化了Class2和Class3。

然后我将属于 Class3 的 var3 发送到 Class2,Class2 会向 var3 追加一个字符串。

但是当我去打印实例变量 var3 (class1.class3.var3) 时,该变量没有按预期更改,它没有被附加到并且仍然只是“class3”。

我正在寻找不同的答案:

  1. 为什么这不起作用
  2. 为什么这种代码风格是一个坏主意,以及您认为实现在各种类之间流畅地传递/更改实例变量的行为的最佳替代方案是什么

这段代码并不用于任何关键的事情,我只是想进一步加深我的理解。这个想法是使用基类(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)
python class variables pyqt instance
1个回答
0
投票

本质上,字符串是不可变的,这意味着它们一旦创建就无法更改。在您的代码的这一部分中:

instance_var += " 由 class2 附加"

您正在将字符串添加到局部变量instance_var。字符串不是唯一不可变的对象,元组也是如此(这是元组和列表之间的区别)。您的尝试仅适用于可变对象,例如数字或列表。或不可变对象,因为您无法就地修改它们,所以您需要一种方法来更新原始对象中的引用。

至于为什么这是一个坏主意,你正在耦合你的类。这使得类的模块化程度降低并且更难维护。您还模糊了数据流,使得很难跟踪数据被修改的位置。好的类设计使用封装,这意味着每个类负责管理自己的状态。

© www.soinside.com 2019 - 2024. All rights reserved.