4

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

4 回答 4

3

在第一个例子中,

self.d = self.d + 1

重新绑定 self.d,使其独立于test.d.

在第二个例子中,

   self.d.append("1")

修改 test.d.

要亲自查看,请id(self.d)在两个构造函数的末尾打印。

如果您修改了第二个示例以匹配第一个示例:

   self.d = self.d + ["1"]

你会看到行为也会改变以匹配。

于 2013-06-29T14:23:37.510 回答
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.

于 2013-06-29T14:43:08.980 回答
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
于 2013-06-29T16:33:21.220 回答
0

To address a class variable use class_name.variable_name, giving :

class test(object):
    d=0
    def __init__(self):
       test.d = test.d + 1;
于 2013-06-29T14:26:52.103 回答