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 即导入成功的模块
"""
该方式常用在框架中 因为框架设计者不可能提前预知后续需要的模块和类

 

posted @ 2019-05-20 18:40  huikejie  阅读(110)  评论(0编辑  收藏  举报