是否有可能在python中有静态类变量或方法?这样做需要什么语法?
随机类定义:
class ABC:
x = 6
Run Code Online (Sandbox Code Playgroud)
首先为abc实例设置一些值,稍后为静态变量设置一些值:
abc = ABC()
abc.x = 2
ABC.x = 5
Run Code Online (Sandbox Code Playgroud)
然后打印结果:
print abc.x
print ABC.x
Run Code Online (Sandbox Code Playgroud)
打印
2
5
Run Code Online (Sandbox Code Playgroud)
现在,我真的不知道发生了什么,因为如果我在类定义x = 6中替换"pass",它将只输出相同的东西.我的问题是,在python的类定义中定义变量的目的是什么,如果看起来我可以随时设置任何变量而不这样做?
另外,python是否知道实例和静态变量之间的区别?从我所看到的,我会这样说.
我一直在努力理解Python对类和实例变量的处理.特别是,我发现这个答案很有帮助.基本上它说如果你声明一个类变量,然后你做一个赋值[instance].property,你将完全分配一个不同的变量 - 一个与类变量不同的命名空间.
所以我考虑过 - 如果我希望我的类的每个实例都有一个默认值(比如零)的成员,我应该这样做:
class Foo:
num = 0
Run Code Online (Sandbox Code Playgroud)
或者像这样?
class Foo:
def __init__(self):
self.num = 0
Run Code Online (Sandbox Code Playgroud)
基于我之前读过的内容,我认为第二个例子是初始化'right'变量(实例而不是类变量).但是,我发现第一种方法也非常有效:
class Foo:
num = 0
bar = Foo()
bar.num += 1 # good, no error here, meaning that bar has an attribute 'num'
bar.num
>>> 1
Foo.num
>>> 0 # yet the class variable is not modified! so what 'num' did I add to just now?
Run Code Online (Sandbox Code Playgroud)
那么..为什么这个有效?我得不到什么?FWIW,我之前对OOP的理解来自C++,因此通过类比(或指向它发生故障)的解释可能是有用的.
从Dive到Python:
通过直接引用类和类的任何实例,都可以使用类属性.
类属性可以用作类级常量,但它们不是真正的常量.你也可以改变它们.
所以我把它输入IDLE:
IDLE 2.6.5
>>> class c:
counter=0
>>> c
<class __main__.c at 0xb64cb1dc>
>>> v=c()
>>> v.__class__
<class __main__.c at 0xb64cb1dc>
>>> v.counter += 1
>>> v.counter
1
>>> c.counter
0
>>>
Run Code Online (Sandbox Code Playgroud)
那么我做错了什么?为什么类变量不通过直接引用类和类的任何实例来维护其值.