什么是封装
# 封:属性是对外隐藏,对内开放的(在类的内部可以直接访问,类的外部无法直接访问)
# 装:申请一个名称空间,往里面装入一系列的属性/名字# class People: # __country = 'china' #变形为_People__country # def __init__(self,name,age,sex): # self.__name = name # self.age = age # self.sex = sex # def func(self): # print('say hello') # print(People.__country) # print(self.__name) # # print(People.country) # s = People('bob',23,'male') # print(People.__dict__)
隐藏属性的底层原理
# 在属性前加__开头实现隐藏(这种隐藏仅仅是语法上的变形操作)
# 这种变形只在类定义阶段(检测语法时)发生一次(因为类体代码仅仅在定义阶段接检测一次)
# 这种隐藏是对外不对内的,即在类的内部可以直接访问,而类的外部无法直接访问,原因是:
# 在定义阶段,类体代码统一发生了一次变形# class Foo: # def f1(self): # print('from foo_f1') # def f2(self): # print('from foo_f2') # self.f1() # # class Bar(Foo): # def __f1(self): # print('from bar_f1') # # obj = Bar() # obj.f2()
封装的意义
# 封装属性的意义:
# 首先定义属性的目的就是给类外部的使用者使用的,隐藏的目的是为了不让外部使用者直接使用,需要类内部开辟一个接口
# 封装数据属性:
# 使外部的使用者通过接口间接的操作被隐藏的属性,精髓在于,我们可以在接口上附加任何逻辑,从而严格的控制使用者对属性的操作
# 封装函数属性:在接口内间接的调用功能,精髓在于隔离了复杂度#通过封装数据属性来严格控制对象修改 class People: def __init__(self,name,age): self.__name = name self.__age = age def info_see(self): print('姓名:%s\t年龄:%s'%(self.__name,self.__age)) def set(self,name,age): if not isinstance(name,str): raise TypeError('用户名必须是字符串!!!') if not isinstance(age,int): raise TypeError('年龄必须是纯数字!!!') self.__name = name self.__age = age tony = People('小马哥',25) tony.set('小马哥',23) tony.info_see()
#通过对函数属性的封装来隔离复杂度 ''' 对于取钱这个操作,可以划分为:插卡,输用户名和密码,输入金额,打印凭条,退卡等... ''' import time class Atm: def __card(self): print('正在插卡...') time.sleep(1) def __pwd(self): print('正在输入用户信息...') time.sleep(1) def __money(self): print('正在输入金额...') time.sleep(1) def __printt(self): print('正在打印凭证...') time.sleep(1) def __exit_os(self): print('正在退出...') def withdraw(self): #进行封装 self.__card() self.__pwd() self.__money() self.__printt() self.__exit_os() p = Atm() p.withdraw()