访问限制
>>> class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
>>> Nelson = Student('Nelsonsang', 24)
>>> Nelson.age = 40
>>> Nelson.age
40
从上例所示,外部代码可以自由地修改实例的属性数据。
若想让内部数据不被外部访问,可以再属性名称前加两个下划线__,这样就变成了一个私有变量(private),内部可以访问,外部不能访问,若需要获得属性数据,在类别自定义中增加get_name类似方法,也可通过set_age等方法来修改属性数据,例如:
>>> class Student(object):
def __init__(self, name, age, score = 90):
self.__name = name
self.__age = age
self.__score = score
def get_name(self):
return self.__name
def get_age(self):
return self.__age
def print_score(self):
print('%s: %s' % (self.__name,self.__score))
def set_age(self, age):
if age >= 1 and age <=100:
self.__age = age
else:
raise ValueError('bad score')
>>> Nelson = Student('Nelsonsang', 24)
>>>
>>> Nelson.set_age(30)
>>> Nelson.get_age
<bound method Student.get_age of <__main__.Student object at 0x0231EDB0>>
>>> Nelson.get_age()
30
>>> Nelson._Student__name
'Nelsonsang'
还存在如下变量名:
__XXX__,前后都有两个下划线的变量,这种变量属于特殊变量,是可以直接访问的,不是private变量;
_XXX,这样的变量外部是可以访问的,但是按照约定俗成的规定,当看到这样的变量,意思就是:“虽然我可以被访问,但请把我视为私有变量,不要随意访问。”
双下划线开头的实例变量也可以从外部访问,是因为python解释器将__XXX变为了_XXX__XXX,所以可以使用_XXX__XXX来访问__XXX变量。(建议不要这样做,因为不同的python解释器可能会把__XXX改成不同的变量名)