首页 > 解决方案 > Python:类和嵌套类之间的属性共享

问题描述

有一些关于间接链接到显然我不理解的属性的东西。如果我有一个类,并且我创建了一个嵌套类,它有一个指向父/控制器类变量的变量,我认为它应该在控制器变量发生变化时发生变化。

例子:

class A():
    def __init__(self):
        self.A_value = 10
        print("A_value in A after init:     " + str(self.A_value))
        self.B = self.B(self)
        print("")
        print("A_value in A after B init:   " + str(self.A_value))
        print("B_value in B after B init:   " + str(self.B.B_value))

    class B():
        def __init__(self, controller):
            self.B_value = controller.A_value
            print("B_value in B after init:     " + str(self.B_value))
            controller.A_value = 1
            print("B_value in B after change:   " + str(self.B_value))

A()

这导致

A_value in A after init:     10
B_value in B after init:     10
B_value in B after change:   10

A_value in A after B init:   1
B_value in B after B init:   10

我期望发生的事情B_value最后也是 1,因为它指向A_value. 为什么不B_value改变?老实说,如果这不起作用,我不明白为什么我的一半代码可以工作。而且我很难想出一种方法来搜索正确的,我知道这肯定会以某种方式在某个地方得到回答。(在 Python 2.7 和 3.7 中测试)

标签: pythonclassreferencenested

解决方案


您不会更改属性引用的现有值;A_value您正在更改名称本身所指的内容。这对该属性仍然引用的原始对象没有影响B_value。您需要阅读https://nedbatchelder.com/text/names.html以全面了解 Python 名称的工作原理。

self.A_value = 10引用self.A_value内存中的特定对象;调用它M1,它是一个int代表 10 的对象。

self.B_value = controller.A_value导致self.B_value引用同一个对象M1

controller.A_value = 1完全不影响M1;它controller.A_value引用了一个M2表示 1 的新对象(称为它)。该B_value对象仍然引用M1


推荐阅读