类变量Vs. python中的实例变量用于int值

时间:2013-06-29 14:18:27

标签: python class python-2.7

我是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']

所以我不确定为什么在处理列表时,整数值不被视为类变量。

4 个答案:

答案 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