访问控制
私有属性(Private):用双下划线开头的属性名,就是私有属性
class Person:
def __init__(self,name,age=18):
self name = name
self.__age = age
def growup(self,i=1):
if i > 0 and i < 150:#控制逻辑
self.__age += i
p1=Person('tom')
p1.growup(20)#正常的范围
print(p1.__age)#可以吗
通过实验可以看出,外部已经访问不到__age了,age根本就没有定义,更是访问不到。那么,如何访问这个私有变量__age呢?
使用方法来访问
私有变量的本质:
类定义的时候,如果声明一个实例变量的时候,使用双下划线,Python解释器会将其改名,转换名称为_类名__变
量名的名称,所以用原来的名字访问不到了。
class Person:
def __init__(self,name,age=18):
selfname=name
self.__age=age
def growup(self,i=1):
if i> 0 and i < 150:#控制逻辑
self.__age+=i
def getage(self):
return self.__age
p1=Person('tom')
p1.growup(20)#正常的范围
#print(p1.__age) #访问不到
p1.__age=28
print(p1.__age)
print(p1.getage())
#为什么年龄不一样?__age没有覆盖吗?
print(p1.__dict__)
#直接修改私有变量
p1._Person__age=15
print(p1.getage())
print(p1.__dict__)
从上例可以看出,知道了私有变量的新名称,就可以直接从外部访问到,并可以修改它。
保护变量:在变量名前使用一个下划线,称为 保护变量
class Person:
def __init__(self,name,age=18):
self name = name
self._age = age
tom=Person('Tom')
print(tom._age)
print(tom.__dict__)
可以看出,这个_age属性根本就没有改变名称,和普通的属性一样,解释器不做任何特殊处理。
这只是开发者共同的约定,看见这种变量,就如同私有变量,不要直接使用。
私有方法:参照保护变量,私有变量使用单下划线,双下划线命名方法
单下划线的方法只是开发者之间的约定,解释器不做任何改变。
双下划线的方法,是私有方法,解释器会改名,改名策略和私有变量相同,_类名__方法名。
方法变量都在类的__dict__中可以找到