# 这是学习廖雪峰老师python教程的学习笔记
1、概览
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
1.1、私有变量
在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
通过访问限制,确保了外部代码不能随意修改对象内部的状态
1.2、用方法获取变量
当外部不能直接访问后,如果外部代码要获取name和score,就只能通过方法了。
class Student(object):
...
def get_name(self):
return self.__name
def get_score(self):
return self.__score
同样,如果外部代码要修改私有变量,也可以通过方法。并且通过方法,可以对传入的值做判断
class Student(object):
...
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
1.3、私有变量的实质
私有变量实质上是:Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量。而不同版本的Python解释器可能会把__name改成不同的变量名
1.4、私有变量的赋值错误
当私有变量设置过后,就不能直接对其操作赋值了。
>>> bart.__name = 'New Name' # 设置__name变量!
此时,你不是真正的在设置bart 实例中 bart.__name的值。因为python 对外解释的私有变量 根本不是这么写的。所以,此时实质是通过 外部代码给bart新增了一个__name变量
2、例子
1、将Student对象的gender字段对外隐藏起来,用get_gender()和set_gender()代替,并检查参数有效性::
# -*- coding: utf-8 -*-
class Student(object):
def __init__(self, name, gender):
self.name = name
self.__gender = gender
def get_gender(self):
return self.__gender
def set_gender(self,gender):
if gender == "male" or gender == "female":
self.__gender = gender
else:
print('gender arg is bad')
# 测试:
bart = Student('Bart', 'male')
if bart.get_gender() != 'male':
print('测试失败!')
else:
bart.set_gender('female')
if bart.get_gender() != 'female':
print('测试失败!')
else:
print('测试成功!')
本文介绍了Python中如何使用私有变量来保护类的内部状态,包括私有变量的基本概念、如何实现以及一些实用的例子。
3763

被折叠的 条评论
为什么被折叠?



