面向对象编程之封装
一、一言简释:封装是面向对象三大特征的最核心的一个特征,封装的结果是隐藏属性。
二、封装数据
1、在数据的变量名前面加上__,就会实现对外隐藏的效果,类外无法通过__变量名访问到该变量,但是可以通过_类名__变量名访问到,所以说封装并不是完全屏蔽了外界的访问,仅仅是语法上的变形。
class Aaa: __x = 1 print(Aaa.__x) # 报错 print(Aaa._Aaa__x) # 结果为 1
2、封装变形会在类的定义阶段统一执行,所以类内部可以对封装数据进行访问。
class Aaa: __x = 1 def look(self): print(self.__x) obj_1 = Aaa() obj_1.look() # 结果为 1
3、封装只能在定义类的时候使用,定义完的类,后续新增的数据无法被封装。
class Aaa: __x = 1 Aaa.__y = 2 print(Aaa.__y) # 结果为 2
4、在定义类时,可以封装对象的属性。
class Aaa: def __init__(self,name): self.__name = name obj_1 = Aaa('tom') # print(obj_1.__name) # 报错 print(obj_1._Aaa__name) # 结果为 tom
5、封装的目的:是为了限制外界对数据的直接操作,可以在类体内增设接口来供外界间接操作,接口可以附加一系列逻辑来定制操作条件。
class Aaa: __x = 1 def change(self,new_val): if type(new_val) is not int: print('必须改为数字') return Aaa.__x = new_val obj_1 = Aaa() obj_1.change('aaa') print(Aaa._Aaa__x) # 结果为 1 obj_1.change(123) print(Aaa._Aaa__x) # 结果为 123
二、封装功能:能够隔离复杂度,将类内一系列功能封装为一个功能
class Func: def __step_1(self): pass def __step_2(self): pass def __step_3(self): pass def total_step(self): Func.__step_1(self) Func.__step_2(self) Func.__step_3(self)