python - 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 中测试)
解决方案
您不会更改属性引用的现有值;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
。
推荐阅读
- javascript - 如何修复:每次用户单击按钮时 CSS 动画都会重置
- redisgraph - 如何使用 Java JRedisGraph 客户端连接到 RedisGraph
- c - 有人可以向我解释这个按位函数中的 putchar 行吗?
- r - 如何在 R 中以特定格式显示数据框
- excel - 多个单元宏代码的总和
- 6502 - 6502初学者问题:进位标志在哪里?
- python - pandas / Python 3中的统计列比较
- reactjs - 在服务器端渲染期间反应情感主题不起作用
- python - NEO4J 底层套接字连接消失 (_ssl.c:2084)
- salesforce - 创建 QuoteLineItems 时缺少 PriceBookEntry 必填字段