为啥使用类变量的这段代码不能像在 Java 中那样工作? [复制]
Posted
技术标签:
【中文标题】为啥使用类变量的这段代码不能像在 Java 中那样工作? [复制]【英文标题】:Why is this code using class variables not working as it would in Java? [duplicate]为什么使用类变量的这段代码不能像在 Java 中那样工作? [复制] 【发布时间】:2016-12-18 02:04:34 【问题描述】:我正在从 Java 迁移到 Python。在 Java 中,静态变量将返回相同的值给一个类的所有对象,即使它被同一个类的另一个对象更改。作者说,在我正在阅读的 Python 书中,如果数据成员的赋值发生在类定义的直接范围内,则将其输入到类命名空间中。
我使用的是 Python 解释器 IDLE,下面是 Python 代码:
class ABC:
OVRLIMIT_FEE=5
>>> a=ABC()
>>> b=ABC()
>>> a.OVRLIMIT_FEE+=1
>>> a.OVRLIMIT_FEE
6
>>> b.OVRLIMIT_FEE
5
但是如果它进入了类命名空间,当它被a和b访问时,它应该不会返回相同的值吗?
【问题讨论】:
虽然你提到了java,但这个问题与它完全无关 您正在更改对象属性而不是 ABC 的属性,请执行ABC.OVRLIMIT_FEE+=1
然后您将得到 6 个
如果您分配给a.OVRLIMIT_FEE
(就像您对a.OVRLIMIT_FEE+=1
所做的那样),您将在a
上创建一个实例变量。如果要访问类变量,请使用ABC.OVRLIMIT_FEE
。
为什么这被标记为重复?引用的问题询问“静态”变量的存在,这是关于它们的特定行为的问题。诚然,答案也涵盖了这个问题。
【参考方案1】:
发生的情况是您创建了一个所谓的 Oldstyle 类,它不支持您(正确)预期的行为。继承 object
以创建一个新样式的类。然后它将按您的预期工作 [...]
使用a.foo += 1
被隐式理解为a.foo = a.foo + 1
,它
代码:
>>> class B(object):
... x=5
>>> b1=B()
>>> b2=B()
>>> b1.x += 1
>>> b1.__dict__
'x': 6
>>> b2.__dict__
>>> B.__dict__
'x': 5 ... and other stuff ...
【讨论】:
b2.x 打印 6,因为对于 B 类,x 是 6。如果它按我的预期工作,它不应该打印 7 吗? 天哪,我不应该在午休时间回答python问题。我会马上更正答案。以上是关于为啥使用类变量的这段代码不能像在 Java 中那样工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我会像在 ng-file-upload 示例使用代码中那样在 AngularJS $timeout 服务中包装一个函数,而不会延迟?