1.什么是封装
. 装:往容器/名称空间里存入名字
. 封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内
2.如何封装
在类内定义的属性前加两个下划线开头(没有两个下划线结尾)
总结:
1. 两个下划线开头的属性实现的隐藏仅仅只是一种语法意义上的变形,并不会真的限制类外部的访问
2. 该变形操作只在类定义阶段检测语法时发生一次,类定义阶段之后新增的两个下划线开头的属性并不会变形
3. 如果父类不想让子类覆盖自己的属性,可以在属性前加两个下划线开头
class Foo:
__x=111 # _Foo__x
__y=222 # _Foo__y
def __init__(self,name,age):
self.__name=name
self.__age=age
def __func(self): #_Foo__func
print('func')
def get_info(self):
print(self.__name,self.__age,self.__x)
#这里__x,__y,__func,__name,__age都被隐藏
实现原理:
以Foo类举例
在类检测语法阶段,会把__开头,不已__结尾的名字变形成(_类目__原名)
例如__x将变形成_Foo__x
类内部的_x都会发生变形,类外部则不会变形,所以类外部无法访问_x,从而实现了隐藏
验证:
可以在类内部打印print(Foo.__dict__)
封装数据属性:将数据属性隐藏起来,类外就无法直接操作属性,需要类内开辟一个接口来外部的使用可以间接地操作属性,可以在接口内定义任意的控制逻辑,从而严格控制使用对属性的操作
对隐藏属性的操作可以在类里面开一个接口,再在里面可以加上条件限制
例:
class People:
def __init__(self,name,age):
self.__name=name
self.__age=age
def tell_info(self):
print('<name:%s age:%s>' %(self.__name,self.__age))
def set_info(self,name,age):
if type(name) is not str:
print('名字必须是str类型傻叉')
return
if type(age) is not int:
print('年龄必须是int类型傻叉')
return
self.__name=name
self.__age=age
obj=People('wzj',18)
obj.set_info('WZJ','18')
obj.tell_info()
property:了解知识点
了解一下?