python的私有变量 是类变量吗?

来源:互联网 发布:mac怎么玩魔兽争霸 编辑:程序博客网 时间:2024/06/06 19:30

答案:我认为是是的

#!/usr/bin/pythonclass MyClass:        count=0        name="default name"        __sex = 1        def viewsex(self):                print self.__sex        def changeclasssex(self):                MyClass.__sex = 9        def changeobjsex(self):                self.__sex +=2        def viewclasssex(self):                print MyClass.__sexr = MyClass();print "view r  default __sex"r.viewsex()print "change r  class private __sex"r.changeclasssex()r2 = MyClass();print "view r2  default __sex"r2.viewsex()print "view r2  now  __sex"r2.viewclasssex()

通过上面的代码,我们通过MyClass.__sex是可以改变__sex的 值的

输出结果:



view r  default __sex1change r  class private __sexview r2  default __sex9view r2  now  __sex9


初始设置为1.

r 对象的方法 changeclasssex  可以改变 __sex的值。

后面的  new的r2对象的值 默认就变成9了,因此。私有变量还是类变量

不同的是对象无法直接访问这个类变量,但是可以通过

r._MyClass__sex  这个变量访问,

因此,我认为,self .__sex 其实就是访问的这个变量的值。

__sex 类私有变量,不允许对象直接访问,间接的通过_MyClass__sex 来访问。


同样: 

print MyClass.__sex;

直接访问类变量会报错:

Traceback (most recent call last):  File "./test.py", line 43, in <module>    print MyClass.__sex;AttributeError: class MyClass has no attribute '__sex'

总体来说:私有变量和其他的类变量没有什么不同。

只不过,私有变量不允许通过类和对象来直接访问,只能在   对象 或 类   的   函数内部调用和修改值。

如果是对象,可以通过r._MyClass__sex调用,这个值实际就是函数体内的self.__sex



再看一个有意思的

#!/usr/bin/pythonclass MyClass:        count=0        name="default name"        __sex = 1        def viewsex(self):                print self.__sex        def changeclasssex(self):                MyClass.__sex = 9        def changeobjsex(self):                self.__sex +=2        def viewclasssex(self):                print MyClass.__sexr = MyClass();print "view r  default __sex"r.viewsex()print "set value"r._MyClass__sex = 55r.viewsex()

结果:

view r  default __sex1set value55


从上面看出 self.__sex 实际就是  _MyClass__sex变量的值,

当我们改变  r._MyClass__sex = 55  操作后

然后查看self.__sex的值已经改变成55.   这说明  self.__sex   实际上就是  self._MyClass__sex 的值


继续说明:

#!/usr/bin/pythonclass MyClass:        count=0        name="default name"        __sex = 1        def viewsex(self):                print self.__sex        def changeclasssex(self):                MyClass.__sex = 9        def changeobjsex(self):                self.__sex +=2        def viewclasssex(self):                print MyClass.__sex        def changeMyClassSex(self):                self._MyClass__sex = 66r = MyClass();print "view r  default __sex"r.viewsex()print "set value"r._MyClass__sex = 55r.viewsex()r.changeMyClassSex()r.viewsex()


结果:

view r  default __sex1set value5566

当我们在函数内改变

self._MyClass__sex = 66

操作后

然后查询:

  print self.__sex

发现   self.__sex 的值也发生了改变,可以看出来    self.__sex  其实是对 self._MyClass__sex  的一个引用。


也就是说:对于类私有变量,无法通过类的方法去访问私有变量,只能通过方法访问

对于类实例化的对象, 对象也是无法访问 __sex,只能在函数体内访问,不过self.__sex只是一个引用,  是对self._MyClass__sex 的引用

self._MyClass__sex  这个变量是public的





0 0