day26
封装
封装就是对外部隐藏内部的属性 以及实现的细节并对外部提供使用的接口 使用者无序知道结果是怎么得到的
封装有隐藏的意思 但不是单纯的隐藏 还是需要通过接口给外部使用的
封装的的好处 提高内部数据的安全性 隔离复杂度 通过接口外部使用起来更加简单
类中 对对象的属性可以进行封装 在初始化对象是 通过在对象属性前加上__对对象属性进行封装
类中 对绑定方法进行封装 可以在函数名前加上__
被封装的属性或者方法 只能在类内部被访问 就算有继承关系 也只能访问到本类的 访问不到父类的封装属性和对象
如果外部需要访问类内部的封装属性 可以通过类中 定义接口方法来给外部使用接口函数可以加一定的逻辑来 外部只需要调用内部的接口函数
如果外部需要修改内部的封装属性 可以通过类中定义修改属性的接口来给外部使用 在接口函数中可以一定的逻辑 外部也只要调用修改的接口来修改内部属性
当然一般类中被封装的属性 一般就是不让外部直接修改的 所以才会被封装起来
python是通过变形的方式来实现封装的 如果属性被封装 他会自动在属性前加上_类名 而这个_类名是被隐藏的
property
是将类中的一个方法伪装成属性
当我们通过对象调用接口的时候 就是对象调用函数 我们可以通过property来伪装成对象查看自己的属性
比如对象中的某一个属性是通过计算得到的 属性的值是不断的变化的 此时我们就需要调用方法来计算这个值
当我们使用property装饰器 我们调用函数 就会伪装成 对象查看自己的属性 这样外部使用者更加清晰 我只是查看的一个属性 而不是调用方法
多态性
多态指的多个不同类对方可以相应同一个方法并产生不同的结果
多态 某种事物具备多个不同的形态
水 气态 液态 固态 动物 人 狗 🐖
其实归根结底他都是同一类 属于基类 他们都继承于基类 他们都应该有基类的方法 所以基类下面的子类可以使用基类的方法 也可以拥有基类的相同方法
多态的带来的好处:
只需要学习基类中的使用方法即可, 不需要关心具体的哪一个类 以及实现的 以不变应万变 提高了灵活性
提高扩展性
如果没有多态 需要分别学习 person cat pig 的不同使用方法 这对于使用者而言太麻烦了
鸭子类型 就是典型的多态 多种不同类型 使用方法一样
常用的内置函数
类中的__str__
该方法在object中有定义 默认行为 返回对象类型以及地址 <__main__.Person object at 0x0000016F450C7390>
在将对象转为字符串时执行
注意:返回值必须为字符串类型
子类可以覆盖该方法来完成 对打印内容的自定义
__del__
当对象被删除前会自动调用 该方法
声明时候会删除对象?
1.程序运行结束 解释器退出 将自动删除所有数据
2.手动调用del 时也会删除对象
注意:该函数不是用来删除对象的
使用场景
当你的对象在创建时,开启了不属于解释器的资源 例如打开了一个文件
必须保证当对象被删除时 同时关闭额外的资源 如文件
也称之为析构函数 构造 的反义词
构造 指的是从无到有
析构 值从有到无
简单的说就对象所有数据全部删除
反省
面向对象中的反省 指的是,一个对象必须具备,发现自身属性,以及修改自身属性的能力;
一个对象在设计初期,可能考虑不够周全后期需要删除或修改已经存在的属性, 和增加属性
反射就是通过字符串来操作对象属性
动态导入模块
"""
直接写import 或者from import 称之为静态导入 建立在一个基础上:提前已经知道有这个模块
动态导入 指的是 在需要的任何时候 通过指定字符串类型的包名称来导入需要的模块
import importlib
mk = importlib.import_module(m_name)
mk 即导入成功的模块
"""
该方式常用在框架中 因为框架设计者不可能提前预知后续需要的模块和类