类的封装
1.封装介绍
总结一句话: 把抽象的属性和方法封装到类中,外部可以通过对象或类来调用对外暴露的方法或属性
封装:将属性和方法,封装到对象中 装:是往容器/名称空间里存放名字 封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内
为什么要封装: 封装数据属性,封装函数属性, 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)
print(Foo.__x) 报错
print(Foo._Foo__x) 111 类外部访问私有属性的方法
2.如何实现私有属性,方法的对外不对内 外部不可以直接访问私有属性或方法,但是可以间接使用
class Foo: def _f1(self): print('foo.. f1') def f2(self): print('foo.. f2') self._f1() # 对外隐藏对内不隐藏 外部调用f1会间接访问f2
3. 封装函数属性:隔离复杂度 内部方法无法确定顺序,直接隐藏不对外开放隔离复杂度 秒懂封装
class ATM: def __card(self): print('插卡') def __auth(self): print('用户认证') def __input(self): print('输入取款金额') def __print_bill(self): print('打印账单') def __take_money(self): print('取款') def withdraw(self): self.__card() self.__auth() self.__input() self.__print_bill() self.__take_money() a=ATM() a.withdraw()