为啥使用类变量的这段代码不能像在 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,它

采用类属性 foo 加1 将结果放入实例属性 foo。

代码:

>>> 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 服务中包装一个函数,而不会延迟?

为啥数组中的这段代码不合适?

为啥这段代码不能在 Java 中运行? [复制]

为啥选择排序算法的这段代码没有给出输出?

java中这段代码为啥报错啊

java 内部类为啥不能static