本文阅读时长大约为 11 分钟
今日内容概述:
多继承及 MRO 顺序 | **args、**kwargs | 类对象、实例对象、类属性、实例属性、实例方法、静态方法、类方法 | 内置方法 | property属性 | 魔法属性 | 面向对象设计 | with 上下文管理器 | 面向对象回顾 | GIL 全局解释器锁回顾
今日内容
一、多继承及 MRO 顺序
使用父类名调用:父类的父类会执行多次
super在多继承中的作用:
_mro_内置属性: 多继承时,输出调用父类方法是顺序 由C3 算法决定
使用 super 调用:父类的父类只需执行一次
二、**args **kwargs
多值参数 拆包、解包
形参时是接收:
*args :接收的是一个元组
**kwargs:接收的是一个字典,由键值对的方式给值
实参时是拆包:
*args:把元组拆成一个个元素值
**kwargs:把字典拆成键值对
三、类对象、实例对象、类属性、实例属性、实例方法、静态方法、类方法
类属性修改只能由类名来操作
实例对象可以用类属性,不能修改,修改就相当于新建了一个实例属性
@staticmethod @classmethod
调用类相关的内容和静态方法推荐使用类名来调用
类属性在内存中保存一份
实例属性在每个对象中都要保存一份
实例方法:由对象调用;至少一个self参数;执行实例方法时,自动将调用该方法的对象赋值给self;
类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类赋值给cls;
静态方法:由类调用;无默认参数;
四、内置方法
不需要程序员调用,python解释器触发某个条件时调用
def _xxx_(self):
私有类属性可以通过 类名.类名_属性名 来访问
五、property属性
使用:在实例方法的基础上添加 @property 装饰器,
可以像调用一个实例属性一样调用实例方法 调用时不需要括号
这个实例方法不要多写参数
使用 property 后,调用时不需要传递参数。
property 属性的两种方式
1.装饰器方式
@property: 获取
@price.setter: 设置 必须两个参数
@price.deleter:删除
经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法
新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法
由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
2.property-类属性
建议使用这一种
property方法中有个四个参数
第一个参数是方法名,调用 对象.属性 时自动触发执行方法
第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
第四个参数是字符串,调用 对象.属性.doc,此参数是该属性的描述信息
六、魔法属性
私有属性,名字重整
魔法属性:
七、面向对象设计
继承 - 是基于Python中的属性查找(如X.name)
多态 - 在X.method方法中,method的意义取决于X的类型
封装 - 方法和运算符实现行为,数据隐藏默认是一种惯例
八、with 上下文管理器
使用 with 打开文件,当离开 with 代码块的时候,系统会自动调用 close() 方法,可以避免使用普通方法打开文件时出现异常无法关闭文件的现象。
上下文管理器
任何实现了 _enter__() 和 \_exit__() 方法的对象都可称之为上下文管理器,上下文管理器可以使用 with 关键字。
实现上下文管理的另一种方式
面向对象回顾面向对象概念
面向过程:做一件事从头到尾都要关心
面向对象:做一件事不关心过程,只关心结果
类:一类事物,一个抽象的概念
对象:是类的具象化
特征(属性)相当于一个变量、功能行为(方法)相当于函数
封装继承多态
封装:
高内聚:把相关功能尽量放在一个类中
低耦合
继承:
概念:子类可以拥有父类的属性和方法
作用:减少代码的书写,提高代码阅读性
单继承:可以一直向下传递
多继承:一个子类可以继承多个父类
方法重写
多态:
一个对象有多种形态
条件:继承和方法的重写
增强代码的灵活性
列表推导式
GIL 全局解释器锁
多任务是指同一时刻可以执行多个任务。
协程开销最小,线程在中,进程消耗最大
协程基于线程,线程基于进程
GIL 同一时刻只允许一个线程在执行。假的并发。多进程每个核消耗占一半,一共100%。
这个问题和python语言没有关系
只在c语言写的 cpython解释器中有这个问题
计算密集型、IO操作
解决:换其他解释器、在需要的位置调用其他语言。
深拷贝、浅拷贝
= 是指向;
copy.copy() 浅拷贝复制引用,不复制数据,节约内存,源数据修改会被影响;
copy.deepcopy() 深拷贝复制数据,不会污染源数据,会占用内存。
列表拷贝,深是深,浅是浅
元组拷贝,两种拷贝都是指向
字典、切片、字符串都是浅拷贝
私有化
作用:数据安全,避免重名
_xxx: 私有属性,防止被导入
__xxx: 私有属性,只在本类中可以用,
_xxx_: 魔法属性, 不能随便定义
xxx__: 避免与关键字冲突
java 语言的私有属性: public int a=5; private String=”aaa”
模块导入
from … import 变量 类似于深拷贝
import 模块 类似于浅拷贝
今日内容多且杂,而且必须记忆,太多了,不好记,慢慢来吧.......
最近总感觉不在状态,有生理原因也有心理原因,需要调节一下。
END
领取专属 10元无门槛券
私享最新 技术干货