封装
1、概念:
--对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口
学习封装的目的是为了能够限制外界对内部的数据访问
在python中属性的权限分为两种(默认为公开的)
--1、公开的
没有任何限制,谁都能访问到,并且可以修改
--2、私有的
只有当前类本身能够访问,并且修改
2、优点:
封装主要封装的是类中的数据,类中的数据分为两种:属性和方法
--1、提高安全度
封装属性(通过方法访问被封装的属性叫访问器,修改属性叫设置器)
--2、隔离复杂度
封装方法(一个为内部提供支持的方法,不应该让外界直接访问,就直接封装起来)
3、封装原理:
--1、python封装的原理就是变形,就是把__开头的名字变形为_类名__名字
--2、所以也可以直接使用变形之后的名字直接访问属性,但通常没必要这么做
--3、变形只会发生一次,就是在类的定义阶段,后续再添加的双下划线开头的名字不会产生变形
4、装饰器property:
作用:把一个方法伪装成属性
原因:为了把访问私有属性的方式变得和访问公有属性一样,可以直接点出来而不用带括号
class Student: def __init__(self,name,age): self.name = name self.__age = age @property # 这样就可以直接通过stu.age访问私有属性了 def age(self): return self.__age stu = Student('faker',20)
与property相关的两个装饰器:
1、setter:如果property装饰了一个函数,可以通过函数名.setter来把方法伪装成修改公有属性的方式,
直接在外界赋值就相当于调用这个方法
2、deleter:如果property装饰了一个函数,可以通过函数名.deleter来把方法伪装成共有属性删除属性的方式,
直接在外界del属性名就相当于调用这个方法
5、计算属性(用到的也是property装饰器)
有些属性它不是固定的,它是通过某些值计算得来的,是一个不稳定的值,这样我们就需要通过对属性的计算得到新的属性,并且把这个新的属性调用方式变成和那些固定的方法一样,例如人的健康指数BMI
多态
1、定义:
多态指的是多个不同类型对象可以响应同一个方法,并且产生不同的结果
2、优点:
只需要学习基类中的使用方法即可,不需要关心具体哪一个类 怎么实现的,以不变应万变,提高拓展性
3、如何实现:
可以通过接口、抽象类来实现,python最崇尚的是鸭子类型
常用内置函数
1、__str__:
执行条件: 当对象被转换成字符串时,会自动执行该函数下的内容
使用场景: print过程中有转换str的步骤,所以可以根据这个函数的特性
自定义一些打印格式
2、__del__: 析构函数
执行条件 : 当对象被删除前,会自动执行该函数
使用场景:
当你的对象在创建时,开启了不属于解释器的资源,例如打开了一个文件
必须保证当对象被删除时,同时关闭额外的资源
总结: __del__该函数用于在对象删除前做一些清理操作
反射
1、反射定义:
指一个对象必须具备发现自身属性,以及修改自身属性的能力
反射就是通过字符串来操作对象属性
2、涉及到的方法:
hasattr:判断是否存在某个属性
getattr:获取某个属性的值
setattr:新增或者修改某个属性
delattr:删除某个属性的值,(必须是自己名称空间有的属性,和hasattr判断条件不一样)
hasattr、getattr、delattr用法一样都是(对象,属性的字符串)
setattr用法(对象,属性的字符串,新增或者修改的值)
动态导入模块
#1、静态导入:直接import导入 ,建立在一个基础上,提前已经知道有这个模块 ,导入方法写死的
#2、动态导入:指的是在需要的时候,通过指定字符串类型的包名来导入需要的模块
import import.lib
mk = importlib.import_module(m_name)
m_name:包名
mk:成功导入的模块
该方式常用在框架中,因为框架设计者不可能提前预知后续需要的模块和类,都是通过动态导入,提供需要导入的包名或模块名进行导入