Python 为什么使用类变量的代码不像在Java中那样工作?

Python 为什么使用类变量的代码不像在Java中那样工作?,python,class,namespaces,static-variables,Python,Class,Namespaces,Static Variables,我正在从Java转向Python。在Java中,静态变量将向一个类的所有对象返回相同的值,即使它被同一类的另一个对象更改。作者说,在我正在阅读的Python书中,如果数据成员的赋值发生在类定义的直接作用域内,则会将其输入到类名称空间中 我使用的是IDLE,Python解释器,下面是Python代码: class ABC: OVRLIMIT_FEE=5 >>> a=ABC() >>> b=ABC() >>> a.OVRLIMIT_F

我正在从Java转向Python。在Java中,静态变量将向一个类的所有对象返回相同的值,即使它被同一类的另一个对象更改。作者说,在我正在阅读的Python书中,如果数据成员的赋值发生在类定义的直接作用域内,则会将其输入到类名称空间中

我使用的是IDLE,Python解释器,下面是Python代码:

class ABC:
    OVRLIMIT_FEE=5

>>> a=ABC()
>>> b=ABC()

>>> a.OVRLIMIT_FEE+=1
>>> a.OVRLIMIT_FEE
6
>>> b.OVRLIMIT_FEE
5
但是,如果它进入了类名称空间,当同时使用a和b访问它时,它是否应该返回相同的值?

发生的是,您创建了一个所谓的Oldstyle类,它不支持您(正确地)预期的行为。从
对象继承
以创建新样式的类。然后它会像你期望的那样工作[…]

使用
a.foo+=1
会隐式取消设置为
a.foo=a.foo+1
,这

  • 获取类属性foo
  • 加1
  • 将结果放入实例属性foo中
代码:


尽管您提到了java,但这个问题与它完全无关。您正在更改一个对象属性而不是ABC的属性,执行
ABC.OVRLIMIT_-FEE+=1
,那么如果分配给
a.OVRLIMIT_-FEE
(就像您对
a.OVRLIMIT_-FEE+=1
所做的那样),您将获得6分,您正在
a
上创建一个实例变量。如果要访问类变量,请使用
ABC.OVRLIMIT\u FEE
。为什么会将其标记为重复?参考问题询问“静态”变量的存在,这是关于它们的特定行为。诚然,答案也涵盖了这个问题。b2.x打印6,因为B类的x是6。如果它像我预期的那样工作,它是否应该打印7?哦,天哪,我不应该在午休时间回答python问题。。我会马上更正答案。
>>> 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 ... }