python - 在 Python 继承中共享类变量
问题描述
我对继承中 Python 中的变量共享概念感到困惑。
考虑以下代码:-
class a(object):
var1 = 0
var2 = {}
def print_var(self):
print(self.var1)
print(self.var2)
class b(a):
@classmethod
def modify_var(cls):
cls.var1 = 1
cls.var2['temp']="something"
o1 = a()
o2 = b()
print("Initial Values")
o1.print_var()
o2.print_var()
print("Changing Values")
o2.modify_var()
print("Print values after change")
o1.print_var()
o2.print_var()
运行上面的代码后,我可以看到字典在子类和父类之间共享,但整数变量不是。
谁能解释一下,或者我在这里做错了什么?
上述代码的输出:
Initial Values
0
{}
0
{}
Changing Values
Print values after change
0 # <- this zero should be one according to my understanding
{'temp': 'something'}
1
{'temp': 'something'}
解决方案
通常,您不想使用可变类变量。类变量由对类的所有实例的对象引用共享。但它不会在继承的类之间共享。
所以共享对象的所有实例都a
引用a.var1
和a.var2
。类似地,所有b
共享对象的实例都引用b.var1
和b.var2
。在创建继承时,b
还获取对var1
and的引用var2
,但它们不会共享回a
或任何实例化a
.
因为你使用了一个可变对象var2
,所以继承后对象的引用永远不会改变。所以你可以修改var2
它,它会被所有对它的引用修改,因为对象引用是相同的。
如果您重新分配var2
而不是修改它,您将获得预期的行为。
试试这个:
class a(object):
var1 = 0
var2 = {}
def print_var(self):
print(self.var1, end=', ')
print(self.var2)
class b(a):
@classmethod
def modify_var(cls):
cls.var1 = 1
cls.var2 = {'temp': 'something'} # reassign to a new dict
以下是一些测试:
ob1 = a()
ob2 = b()
o1.print_var()
o2.print_var()
o2.modify_var()
o1.print_var()
o2.print_var()
# prints
0, {}
0, {}
0, {}
1, {'temp': 'something'}
推荐阅读
- python - Python:如何计算数据框中特定列中的特定值
- javascript - Jquery Closest 找不到元素
- angular - 错误 - 预检请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头
- java - JUnit Test with InjectionPoint for @Produce on 自定义限定符的方法
- c# - 这是什么 ASP.NET Core 日志消息:Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager
- android - Kotlin - java.lang.IllegalStateException:ViewStub 必须有一个非空的 ViewGroup viewParent
- php - 一次想要 2 个滑块行
- amazon-web-services - list-buckets s3api 没有显示我的存储桶创建日期?
- javascript - 如何在 ACE 编辑器中为所有键启用 onkeydown 事件
- python - 从Python中的线程中的函数获取返回值