python的私有属性和方法,大概理解为,外部不能直接访问。但是其实并不保密,通过dir()可以查看。
一,私有属性
通过dir()就能查找到该属性,并可以直接查看属性
class Person(object):
def __init__(self, name, age):
self.name = name
self.__age = age
#定义访问私有属性功能
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
p1 = Person('Lan', 18)
print(dir(p1))
print(p1._Person__age)
# 使用get方法,可以直接调用私有属性
print(p1.get_age())
结果:
结论:
1.Python的私有属性并不是完全禁止外部访问
2.使用get,set方法可以对私有属性进行赋值和获取,在类的外部也可以使用他
那既然看起来同样会被外部访问,那私有属性的意义何在呢?
通过上述的get,set方法对属性修改,如果在这些模块中,加入判断逻辑,保证数据输入的准确性。以下为例子
class Person1(object):
def __init__(self, name, age):
self.name = name
self.__age = age
def get_age(self):
# 告知的年龄比真实年龄小5岁,小于18岁就是18岁
age = self.__age - 5
if age < 18:
return 18
else:
return age
def set_age(self, age):
# 重置的年龄在0到100之间,大于100就是100,小于0就是0
if age > 100:
self.__age = 100
elif age < 0:
self.__age = 0
else:
self.__age = age
p1 = Person1('Lan', 35)
# get方法已设置提取规则
print(p1.get_age())
# 录入数据已设置规则和约束
p1.set_age(115)
print(p1.get_age())
通过这个案例,私有属性结合自定义方法使用,添加约束和规则,保护数据,同理可以约束身份证号是否规范,手机号码是否规范等。
二、私有方法
流程化的方法,外部不需要知道过程,直接可以利用私有方法封装到一起,简化程序运行
'''
大象装冰箱,总共分三步
1.打开冰箱
2.放大象
3.关上冰箱
但是这里并不想关心过程,只想一个操作告知我上述都完成了
'''
class Elephantgofridge:
def __openfridge(self):
print('打开冰箱')
def __putelephant(self):
print('放大象')
def __closefridge(self):
print('关上冰箱')
def elegofri(self):
self.__openfridge()
self.__putelephant()
self.__closefridge()
print('大象装好了')
e1=Elephantgofridge()
e1.elegofri()
结果直接完成所有步骤,不需要每一个方法都挨个执行
以上总结,私有属性可以规范数据读写规则,私有方法简化代码运行。