我是python的新手,我不确定这是如何工作的。代码如下:
class test():
d=0
def __init__(self):
self.d=self.d+1;
D=test()
print D.d
D1=test()
print D1.d
D2=test()
print D2.d
输出
1,1,1 # This should not be
现在使用这个:
class test():
d=[]
def __init__(self):
self.d.apend("1");
D=test()
print D.d
D1=test()
print D1.d
D2=test()
print D2.d
结果是(应该是)
['1']
['1', '1']
['1', '1', '1']
所以我不确定为什么在处理列表时,整数值不被视为类变量。
答案 0 :(得分:3)
在第一个例子中,
self.d = self.d + 1
重新绑定 self.d
,使其独立于test.d
。
在第二个例子中,
self.d.append("1")
修改 test.d
。
要亲眼看看,请在两个构造函数的末尾打印id(self.d)
。
如果您修改了第二个示例以匹配第一个示例:
self.d = self.d + ["1"]
你会发现行为也会改变以匹配。
答案 1 :(得分:3)
如果要修改类变量,请执行:
class test(object):
d=0
def __init__(self):
type(self).d=self.d+1;
D=test()
print D.d
D1=test()
print D1.d
D2=test()
print D2.d
您不需要分配右侧的type
,因为这样您就不会创建实例变量d
。请注意,新样式类是必需的。
type
是一个函数(实际上是一个可调用的 - 它也是一个类;但现在不要担心它),它返回其参数的类。因此,type(self)
会返回self
的类。类是Python中的第一类对象。
在这里演示:http://ideone.com/JdNpiV
更新:另一种方法是使用classmethod
。
答案 2 :(得分:0)
要使用class_name.variable_name来处理类变量,请给出:
class test(object):
d=0
def __init__(self):
test.d = test.d + 1;
答案 3 :(得分:0)
NPE的答案告诉你代码出了什么问题。但是,我不确定它是否真的告诉你如何正确解决问题。
如果每个test
实例在实例变量中应具有不同的d
值,那么这就是我想要的内容:
class test(object): # new style class, since we inherit from "object"
_d = 0 # this is a class variable, which I've named _d to avoid confusion
def __init__(self):
self.d = test._d # assign current value of class variable to an instance variable
test._d += 1 # increment the class variable
现在,您可以创建多个实例,每个实例都会获得d
的唯一值:
>>> D0 = test()
>>> D1 = test()
>>> D2 = test()
>>> print D0.d
0
>>> print D1.d
1
>>> print D2.d
2