论坛首页 编程语言技术论坛

python的类变量,好困惑哦

浏览 11029 次
精华帖 (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的@@,这里就是想不通...望各位指点一下 
   发表时间:2005-06-30  
我刚刚开始接触python,不过既然A是static变量,那么就应该是4。如果你认为它是0,那么就没有理解什么是static变量。
0 请登录后投票
   发表时间:2005-07-01  
如果变量名一样,起始是指向同一块内存,只要改变了其中一个的值两个变量的值当然一样,如果你试试改变另一个变量值后就会发现它们才真正各不相干
0 请登录后投票
   发表时间:2005-07-01  
我觉得应该这样理解:
第23行打印之前,你没有调用过A2.setA(),也就是说A2到23行的时候,是没有实例变量的(python中,变量因赋值而诞生),于是A2.A找到了A2的类变量,所以显示出来的是4。你调用了A2.setA(7)之后,那么A2.A会首先找到实例变量,就会显示出来7了(实例变量优先于类变量)。
总而言之,要注意Python是动态语言,很多东西是动态建立的
0 请登录后投票
   发表时间:2005-07-03  
厌倦发呆 写道
我觉得应该这样理解:
第23行打印之前,你没有调用过A2.setA(),也就是说A2到23行的时候,是没有实例变量的(python中,变量因赋值而诞生),于是A2.A找到了A2的类变量,所以显示出来的是4。你调用了A2.setA(7)之后,那么A2.A会首先找到实例变量,就会显示出来7了(实例变量优先于类变量)。
总而言之,要注意Python是动态语言,很多东西是动态建立的


谢谢,这样理解比较合理...   看来python和ruby还是有很大不同的....
0 请登录后投票
   发表时间:2005-07-03  
flytinge 写道
我刚刚开始接触python,不过既然A是static变量,那么就应该是4。如果你认为它是0,那么就没有理解什么是static变量。

不是的,如果按你的理解,把python的类变量和java,ruby的static变量等同起来,那么第23行打印的也应该是4啊,但是实际上却是3,python应该是把类看成一个实例对象,类的对象也是实例对象,两个对象如果用到了同名的字段,就是上面的情况,不知道这样理解合适不合适
0 请登录后投票
   发表时间:2005-07-27  
两个A不一样,一个是类变量,一个是实例变量
a1.A引用的是实例变量A
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics