您的位置:首页 > 编程语言 > Python开发

Python 4.2 访问限制

2016-01-17 00:08 483 查看
访问限制
在class内有实例和方法,而外部代码可以通过直接调用实例变量的方法直接操作数据,这样,就隐藏了内部复杂的逻辑。
但是,从前面的Student类来看,外部代码还是可以自由的修改一个实例的name、score属性。

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在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))
改完后对外部代码来说没有什么影响,但已经无法从外部访问实例变量.__name和实例变量.__score属性了。

>>>bart =Student('bart',97)

>>>bart.__name
Traceback (most recent call last):

File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'
这样确保了外部代码不能随便更改对象内部的状态。通过访问限制的保护,代码更加强壮。
但是,如果外部想获取name和score属性怎么办?可以给Student增加get_name,get_score这样的方法:
def get_name(self):
return self.__name
def get_score(self):
return self.__score
如果又要允许外部修改score怎么办?

def set_score(self,score):
self.__score =score
通过在类中增加的方法,可以对参数进行检测,避免传入无效参数:

class Student(object):
.
.
.
def get_score(self,score):
if 0 <= score <=100:
self.score =score
else:
raise ValueError('bad score')
需要注意的是,在Python中,变量名类似__xx__的,是特殊变量,特殊变量是可以直接访问的。不是private变量,所以不能用__name__ __score__这样的变量命名。
以_开头的实例变量,表示'虽然我是可以被访问的,但是,请将我是为私有变量,不要随意访问。'

双下划线的实例变量是不是一定不可以访问呢,其实也不是。Python解释器将__name变量改为_Student__name,所以,通过_Student__name来访问__name属性:
>>>bart._Studnet__name
'bart'
但是强烈不建议这样做,因为不同的Python版本,可能会把__name改为不同的变量名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python 访问限制