首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python类变量是静态的吗?

Python类变量是静态的吗?
EN

Stack Overflow用户
提问于 2018-06-05 05:15:32
回答 1查看 89关注 0票数 7

查看以下代码:

代码语言:javascript
复制
class Super:
    powers = 'no power'
    def __init__(self, name):
        self.name = name

    def add_power(self, power):
        self.powers = power

dog = Super('dog')
cat = Super('cat')

dog.add_power("bark")
print (dog.powers) # print bark
print (cat.powers) # print no power

看起来python的类变量独立于每个实例,因为将狗实例的powers变量从无电源更改为叫不会影响猫实例的powers变量

但是,通过这样做:

代码语言:javascript
复制
class Super:
    powers = ["no power"]
    def __init__(self, name):
        self.name = name

    def add_power(self, power):
        self.powers.append(power) 

dog = Super('dog')
cat = Super('cat')

dog.add_power("bark")
print (dog.powers) # print ['no power', 'bark']
print (cat.powers) # print ['no power', 'bark']  # why cat.powers is also affected???

该示例显示powers变量(这次是一个列表)是静态的,因为向dog实例的powers追加一个元素也会影响cat实例的powers

我还尝试了将幂函数改为整数,并通过调用add_power将幂函数递增1,它们之间并不相互影响。所以我真的很困惑,为什么将一个元素附加到一个列表中,这是一个类变量会影响其他实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 05:24:27

实例变量名可以隐藏同名的类变量。

代码语言:javascript
复制
>>> class A:
...     var = 'class var'
...     
>>> a = A()
>>> vars(a)  # no instance variables
{}
>>> a.var  # attribute lookup resolved at the class level
'class var'
>>> a.var = 'instance var'  # create an instance variable
>>> vars(a)  # the name `var` now exists in the instance dict
{'var': 'instance var'}
>>> a.var  # attribute lookup resolved at the instance level
'instance var'
>>> type(a).var  # note: the class variable still exists!
'class var'
>>> del a.var  # deletes from the instance dict
>>> a.var  # ..but the name `var` remains available at the class level
'class var'
>>> vars(a)  # instance dict is again empty
{}

类变量不是“静态的”(可以通过普通的属性访问修改或删除A.var)。取而代之的是:访问a.var首先在实例的名称空间(a.__dict__)中尝试名称var,如果失败,则返回到签入类的名称空间(A.__dict__)。

在类对象上使用列表时,您看不到相同行为的原因是,此行不是

代码语言:javascript
复制
self.powers.append(power)

一个使用赋值语句的看似等价的版本将重新创建与您观察到的相同的名称隐藏:

代码语言:javascript
复制
self.powers = self.powers + [power]  # not actually equivalent!

总而言之:当对class属性使用整数或字符串时,您在实例名称空间中创建了一个条目(由于赋值语句),但是当使用列表时,您直接对class变量执行操作,该变量实际上在所有实例之间共享。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688881

复制
相关文章

相似问题

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