在学习python的类这一块的时候,发现了一件好玩的事情:
- 教程上面说,我们一般把变量名前面加上两个下划线就可以把成员标记成私有的,我试着用s.__name去访问私有成员name的时候,确实有一个报错
- 但是好玩的事情在于,我居然可以用s.__name去赋值给name这个私有成员,更加好玩的事情出现了,我在进行完这一步的操作的时候,居然能够用上面行不通的方法去获取到name的值了
- 于是我赶紧写了一个get_name方法,去获取真正的name,此时发现,真正的name并没有被更改
- 然后我又写了一个set方法,在实例上面调用这个方法,然后用get_name去打印出这个更改后的内容,发现实例的name已经被更改了
- 然而当我再一次用上面的print(s.__name)去打印的时候,这个东西居然还是我前面硬赋值的那个值?
- 百度过后,我发现,可以用_类名__成员名这种骚操作去访问本应该是私有成员的name emm,python可真是个磨人的小妖精哦
class Student(object):
def __init__(self,name,score):
self.__name=name;
self.__score=score
def print_detail(self):
print("name:%s"%self.__name)
print("score:%s"%self.__score)
def get_score(self):
if self.__score>=90 :return 'A'
elif self.__score>=80 :return 'B'
elif self.__score>=70 :return 'C'
def print_info(self):
print("name: %s grade:%s"%(self.__name,self.get_score()))
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
s=Student('abc',90)
#print(s.__name)#运行这一行会报错:AttributeError: 'Student' object has no attribute '__name'
s.print_info()
#这段代码不会出错,但是并没有修改实例本身的__name属性
s.__name='xyz'
#这里很奇怪可以直接获取到赋给它的值,但是这个值确实没有刷新的实例内部,如下代码可以验证
print(s.__name)
print(s.get_name())#用类的方法访问__name属性
#这段代码可以更改实例本身的_name属性
s.set_name('123')#正常的设置
print(s.get_name())#正常的访问
print(s.__name)#可以看到在正常更新后它的值还是前面通过非法方法赋给这个成员的值
print(s._Student__name)#传说中的可以用_类名__私有变量的值可以非法获取到正确的实例成员值
运行结果:
name: abc grade:A
xyz
abc
123
xyz
123