初学者对pyhton里的类里变量的疑惑

初学者对pyhton里的类里变量的疑惑

class Per:
    a = ""
    def say (self,n):
        self.name = n
        self.a += n
        Per.a += n
        print "This name is",self.name
        print "This sefl.a is",self.a
        print "This Per.a is",Per.a

Q = Per()
Q.say("QQ")

P = Per()
P.say("PP")

输入结果:

---------- Python ----------
This name is QQ
This sefl.a is QQ
This Per.a is QQ
This a is QQ
This name is PP
This sefl.a is QQPP
This Per.a is QQPP
This a is PP

输出完成 (耗时 0 秒) - 正常终止

这样的话,对像P不就干扰了Q对像了吗?每一个对像在实例化后不是应该是一个全新的对像吗?这怎么把前面对像里的东西都带过来了呀?
还有,这里的Per.a和self.a有没有区别?如果有,在哪里?

我是初学,见笑了

class Per:
    a = ""
    def say (self,n):
        self.name = n
        self.a += n
        Per.a += n
        print "This name is",self.name
        print "This sefl.a is",self.a
        print "This Per.a is",Per.a

这里的 a 是一个类属性,在class Per的所有实例中会共享这个类属性, 如果希望a是一个对象属性,可以把a放在类的构造函数__init__中进行初始化
这里有一个对类属性的描述,可以参考一下 :
http://man.chinaunix.net/develop ... lassattributes.html
谢谢

但网址打不开
Per.a 指的是 Per class 的属性。

self 指的是由你由某个class 实例化 后的 instance (在你的程序中,Q,P 就是instance ,它们继承class 的属性。)
所以 self.a 指的是 instance的属性。


在你的程序中。
self.a += n   # 你改变了 Q 这个 class Per 的 instance 的属性。  这不会对 class Per 产生影响。


Per.a += n  # 你直接 改变了 class Per 的属性。  当你下一次用 class Per 产生新的 instance 时。这个改变了属性当然会被继承给 instance P.    所以你第二此print "This sefl.a is",self.a   的结果会不同。

如果你想每次 实例化 class Per时都取得全新的 self.a 。  你可以这样:
class Per:
    def __init__(self)
        self.a = ""
    def say (self,n):
        self.name = n
        self.a += n
        Per.a += n
        print "This name is",self.name
        print "This sefl.a is",self.a
        print "This Per.a is",Per.a

不知道说清楚了吗?
http://www.diveintopython.org/    其中有limodou翻译的中文版


QUOTE:
原帖由 lvscar 于 2006-9-13 01:30 发表
Per.a 指的是 Per class 的属性。

self 指的是由你由某个class 实例化 后的 instance (在你的程序中,Q,P 就是instance ,它们继承class 的属性。)
所以 self.a 指的是 instance的属性。


在你的程序中。 ...

self.a按说是不能继承下到下一个实例的呀?但它打出了:This sefl.a is QQPP,我就是对这点不理解。
呵呵,,,在每个 instance 里 ,对它自己的  reference  就是self。。  就是说,每个instance 都有一个 self.

当你的程序 运行到  P = Per()  时, instance P 里的 self.a 继承的不是  instance Q里的 self.a 而是,被你在
Per.a += n  语句中修改过的 Per.a

.