答案:我认为是是的

#!/usr/bin/python
class 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

r = 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 __sex
1
change r  class private __sex
view r2  default __sex
9
view r2  now  __sex
9


初始设置为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/python
class 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

r = MyClass();
print "view r  default __sex"
r.viewsex()

print "set value"
r._MyClass__sex = 55
r.viewsex()

结果:

view r  default __sex
1
set value
55


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

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

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


继续说明:

#!/usr/bin/python
class 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 = 66

r = MyClass();
print "view r  default __sex"
r.viewsex()

print "set value"
r._MyClass__sex = 55
r.viewsex()

r.changeMyClassSex()
r.viewsex()


结果:

view r  default __sex
1
set value
55
66

当我们在函数内改变

self._MyClass__sex = 66

操作后

然后查询:

  print self.__sex

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


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

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

self._MyClass__sex  这个变量是public的





Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐