浏览 11029 次
锁定老帖子 主题:python的类变量,好困惑哦
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-06-28
1#!/usr/bin/env python 2 class clazz: 3 A=0; 4 def getA(self);: 5 return self.__class__.A 6 7 def setA(self,ax);: 8 self.A=ax 9 def setA_(self,ax);: 10 self.__class__.A=ax 11 12 13 a1=clazz();; 14 a2=clazz();; 15 print a1.A 16 print a2.A 17 print a1.getA(); 18 print a2.getA(); 19 print "==============" 20 a1.A=3 21 a1.setA_(4); 22 print a1.A 23 print a2.A 24 print a2.getA(); 25 print a1.getA(); 26 print "==============" 27 print clazz.A 第23行的输出是4不是0,为什么?我只是在第21行把4赋值给了__class__的A啊,a2的A并没有改变过,不是依旧是0么?怎么变成了4... 刚开始学...以前习惯了java的static和ruby的@@,这里就是想不通...望各位指点一下 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-06-30
我刚刚开始接触python,不过既然A是static变量,那么就应该是4。如果你认为它是0,那么就没有理解什么是static变量。
|
|
返回顶楼 | |
发表时间:2005-07-01
如果变量名一样,起始是指向同一块内存,只要改变了其中一个的值两个变量的值当然一样,如果你试试改变另一个变量值后就会发现它们才真正各不相干
|
|
返回顶楼 | |
发表时间:2005-07-01
我觉得应该这样理解:
第23行打印之前,你没有调用过A2.setA(),也就是说A2到23行的时候,是没有实例变量的(python中,变量因赋值而诞生),于是A2.A找到了A2的类变量,所以显示出来的是4。你调用了A2.setA(7)之后,那么A2.A会首先找到实例变量,就会显示出来7了(实例变量优先于类变量)。 总而言之,要注意Python是动态语言,很多东西是动态建立的 |
|
返回顶楼 | |
发表时间:2005-07-03
厌倦发呆 写道 我觉得应该这样理解:
第23行打印之前,你没有调用过A2.setA(),也就是说A2到23行的时候,是没有实例变量的(python中,变量因赋值而诞生),于是A2.A找到了A2的类变量,所以显示出来的是4。你调用了A2.setA(7)之后,那么A2.A会首先找到实例变量,就会显示出来7了(实例变量优先于类变量)。 总而言之,要注意Python是动态语言,很多东西是动态建立的 谢谢,这样理解比较合理... 看来python和ruby还是有很大不同的.... |
|
返回顶楼 | |
发表时间:2005-07-03
flytinge 写道 我刚刚开始接触python,不过既然A是static变量,那么就应该是4。如果你认为它是0,那么就没有理解什么是static变量。
不是的,如果按你的理解,把python的类变量和java,ruby的static变量等同起来,那么第23行打印的也应该是4啊,但是实际上却是3,python应该是把类看成一个实例对象,类的对象也是实例对象,两个对象如果用到了同名的字段,就是上面的情况,不知道这样理解合适不合适 |
|
返回顶楼 | |
发表时间:2005-07-27
两个A不一样,一个是类变量,一个是实例变量
a1.A引用的是实例变量A |
|
返回顶楼 | |