【问题标题】: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
  • 为什么这被标记为重复?引用的问题询问“静态”变量的存在,这是关于它们的特定行为的问题。诚然,答案也涵盖了这个问题。

标签: python class namespaces static-variables


【解决方案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问题。我会马上更正答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 2011-07-04
  • 2012-02-16
相关资源
最近更新 更多