GIL全局解释器锁
- 一个进程一个gil锁,单进程多线程无法实现并行,多个线程争夺锁gil锁,浪费了资源
- 使用进程数等于cpu数最大效率运行,可以采用进程的方式实现真正的并行
- 历史遗留问题,解决单核时代多任务实现,gil全局解释器锁仅存在Cpython解释器中
imopt与from的区别以及重载模块
- import是导入模块中的数据,数据存在时则是引用内存中的数据
- from是重新导入创建一份新的数据,可以简单理解成深拷贝
- 当多模块需要共用一个数据时,必须使用import导入
- 当模块文件发生修改后,可以使用reload重载模块对象,reload(需要重载的模块名)
- import sys 使用sys.path可以查看导入查询路径,默认优先使用当前路径
- sys.path.append('路径') 或insert(下标,'路径')添加新的模块路径,可以确保先查询这个路径
- 要避免使用了相同的模块名,导致导入意料之外的数据
深拷贝与浅拷贝
- 浅拷贝只是创建一个变量指向原有的数据,即引用
- 深拷贝是重新在内存中创建一份数据,保证数据的独立性
- 赋值本质上就是对象之间的引用传递,也就是多个对象执行同一个数据空间
- 时间角度,浅拷贝花费时间更少
- 空间角度,浅拷贝花费内存更少
- 效率角度,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。
多继承super和MRO算法顺序
- 多继承 一个子类同时继承自多个父类,又称菱形继承、钻石继承。
- mro解决了多继承时,每个类只出现一次
- super本质上按照MRO顺序去进行调用方法,类名.__mro__()或类名.mro()获取类的mro顺序表
- 使用super可以保证多继承的情况下,每个类只初始化一次,而使用类名的方法会导致方法被执行多次
- 使用super方法会执行全部父类的方法,使用类名的方法时需要将每一个父类写一遍
- 继承时传参,使用super或类名的方式,都必须传递父类所需要的全部参数,否则报错,
魔法方法和属性
- __init__:初始化执行
- __str__:打印对象时执行
- __del__:对象被销毁时执行
- __doc__:函数的说明文档
- __call__:对象()时执行
- __dict__:输出对象的所有属性
- __module__:输出当前对象所在的模块
- __class__:输出当前对象所在的类
@property装饰器
- 使用property装饰类中方法后,可以当做属性一样直接使用,无需添加()
- 使用property可以来创建一个只可以被读取的常量值
- 添加过property后,可以使用@指定同名方法名.setter,@同名方法名.deleter,
- setter可以当做普通属性一样直接修改值,deleter进行删除
with与上下文管理器
- with 上下文管理器 as 对象:要执行的代码
- 使用with时,不管是否发生异常,都会自动关闭对象
上下文管理器:本质上就是可以被with操作的对象
- 使用类实现上下文管理器
- 类实现__enter__方法,方法内返回操作对象
- 类实现__exit__方法,退出时执行的语句(异常也会执行)
- 工作中需要自动关闭时,我们可以用上下文管理器对代码进行封装
闭包
- 一个函数内部还有一个内层函数,函数返回值为返回内层函数的引用
- 通过在函数内部嵌套重新定义一个函数 并且该函数还可以直接使用外部函数提供的变量
装饰器
- 前提:不改变原有代码,增加新的功能
- 开放封闭原则:已经实现的功能代码不允许被修改,但可以被扩展
- 道德上,不改变原有的参数和返回值
应用场景
- 引入日志
- 函数执行时间统计
- 执行函数前预备处理
- 执行函数后清理功能
- 权限校验等场景
- 缓存
执行顺序
- 先检查原函数代码,再执行语法糖即装饰语句
- 先包由内向外,后执行由外向内
使用
- 存在一个已有功能的函数
- 创建一个补充额外功能的闭包函数,闭包函数内要执行传入的引用(原有函数的功能)
- 在需要被添加额外功能的函数上面@添加额外功能的闭包函数名
类装饰器
- 定义一个类,__init__函数中,接受一个func参数,self.__func = func,
- 然后实现__call__函数,函数中进行添加装饰功能,并进行调用原来函数,self.__func ()
and与or
- 在python中,and和or执行布尔逻辑运算,但它们返回的不是布尔值,使用and时,如果所有值为真,则返回最后一个真值,如果某个值为假,则返回第一个假值
- 使用or时,如果所有值为假,则返回最后一个假值,如果有值为真,则返回第一个真值
- 逻辑运算符:连接条件运算
- 0为false ‘0’为True
栈、队列、管道
- 栈:先进后出
- 队列:先进后出
- 管道:连接,将输入原形输出
#TODO 主要备注