python的私有变量 是类变量吗?
答案:我认为是是的
#!/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的
更多推荐



所有评论(0)