首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python继承中共享类变量

在Python继承中共享类变量
EN

Stack Overflow用户
提问于 2018-04-30 19:34:53
回答 1查看 469关注 0票数 2

我对继承中的Python中的变量共享概念感到困惑。

考虑以下代码:

代码语言:javascript
复制
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()

运行上面的代码后,我可以看到字典在子类和父类之间共享,但整数变量没有。

有人能解释一下这一点吗,或者我在这里做错了什么?

以上代码的输出:

代码语言:javascript
复制
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'}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-30 20:04:06

通常,您不希望使用可变类变量。类变量通过对象引用共享给类的所有实例。但它不会在继承的类之间共享。

因此,所有a实例都共享对a.var1a.var2的对象引用。类似地,所有b实例都共享对b.var1b.var2的对象引用。在创建继承时,b还会获得对var1var2的引用,但它们不会被共享回aa的任何实例化。

因为您将可变对象用于var2,所以在继承之后,该对象的引用永远不会更改。因此,您可以修改var2,所有对它的引用都会修改它,因为对象引用是相同的。

如果您重新分配var2而不是修改它,您将获得预期的行为。

试试这个:

代码语言:javascript
复制
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

以下是一些测试:

代码语言:javascript
复制
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'}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50099699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档