GIL (全局解释器锁)
因为 C语言写的 Python解释器的原因,遗留下的这个问题。
就是 Python里的多线程 不会同时执行,而是会轮询执行,同一时刻只有一个线程在执行。
而 多进程 才会是 多个进程同时执行;才能发挥多核CPU的能力。
如果换用别的解释器多线程就会可以同时执行了。
深拷贝,浅拷贝
一般为 浅拷贝,也就是 只拷贝 数据的地址
也就是说,拷贝后,如果上一个变量把这个数据给改了,那么拷贝后的数据也跟着被改
import copy
a = [1,2,3]
b = a # 引用,可以归纳到浅拷贝中去
c = copy.copy(a) # 浅拷贝
d = copy.deepcopy(a) # 深拷贝
# 可以用 id(b) 来查看地址号
深拷贝,把这个变量指向的数据内容 拷贝一份,来指向新的这份数据,这样就不会受上个变量的改变的影响了。
copy模块拷贝的时候,只拷贝当前包含的数据指向地址,之后添加的不会被关联到拷贝到的对象。
在用 copy.copy() 拷贝元组时,因为元组是不可变的,不会进行拷贝,只是直接指向数据。而不会开辟内存另外指向这份数据。
如果元组里有 指向 可变数据类型的 数据,那么在用 copy.deepcopy() 进行深拷贝时 会新开辟内存来存放拷贝过来的数据。
会自动判断 元组中的数据类型,进而选择 拷贝的类型。
私有化
XX : 共有变量
_XX : 单前置下划线, 私有化属相或方法,不能 from import * 导入,类的对象和子类可以访问
_XX : 双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问。防止子类意外重写基类的方法或属性。也是私有的,可以from import * 导入的。
__XX__ : 双 前后下划线 ,魔法对象或属相,一般不定义自己的这样的名字
XX : 单 后置下划线,为了避免与关键字冲突
import
# 为模块 起别名
from XXXX import YYYY as xyxy
做两件事,加载 XXXX模块的YYYY到当前模块,在当前模块定义一个变量 xyxy 指向 加载的YYYY
避免导入的模块与自己定义的变量名 相同
import 只能导入一个模块一次,之后再导入无效,如果修改了模块,想要重新导入运行中的程序
from imp import reload
reload(模块名) # 是需要先导入的
搜索路径
import sys
sys.path
# 会把 系统搜索路径列出来,返回一个列表,列表的顺序代表Python解释器在搜索模块时的先后顺序
# 添加新模块的路径
sys.path.append("路径地址")
sys.path.insert(0,"路径地址") # 先搜索这个路径
多模块开发时:
import XXX 会把这个模块导入到 内存中,这样在多个模块中都这样导入时,这些模块会共用内存中的XXX模块。
from XXX import * 会把这个模块中内容导入到 单独的一块内存中,供导入到的当前模块使用。
封装 继承 多态
多态是 继承后加以修改,就变成了 多种形态啦
多继承中的 可以有多个父类。
Python 里 可以 重写,方法的重新实现覆盖父类的方法;不支持重载,后面的会覆盖前面的。
因为 在Python中,函数名就相当于变量名。
在重写时 ,如果要使用父类中的这个方法的内容,可以在重写的方法中加上 父类名.方法名(参数列表)
多态 是 子类中 有重写父类的某些方法,这样不同的子类调用的效果不同,就成了多态。
菱形继承,会导致多次调用的问题。
Python解释器 里的 C3 算法(确保每个类只调用一次) 会 确定 类的继承顺序,就是在 一个类里调用 super() 时,C3算法会决定调用的是哪一个类。
对于单继承 与 类型.init() 一样。
super()里可以写上指定的类,直接从这个类开始 在 mro 顺序里 匹配继承关系。
*args :接受多个 元组 元素
**kwargs : 接受多个 字典元素
在函数里,要想再次使用 可以 再加上 * 和 ** 进行拆包再使用。
继承 并不是 复制,而是 指向
类 ,实例
都会 占用 内存空间
类属性:只在内存中保存一份 ; 对于多有实例都相同的属相,可以设为类属相。
实例属性:每个实例对象都单独保存一份自己的。
类方法: 在正常方法前加 @Classmethod ,默认传 类引用m
实例方法: 正常的写法, def XXX () : 默认传实例引用; 不是自己独有的,也是引用类中的方法,只是调用的实例不同传入的参数不同。
静态方法:为了 使得 一些 较独立的方法 在跨模块使用时产生歧义,就放到了类里面,默认不传任何引用
类对象 只能调用 类方法和静态方法
实例对象 : 可以调用以上三种方法。
property 属性 , 能够简化调用者在获取数据的流程
被这个注解 标注的方法 通常 返回一个值 ,并且这个方法只有一个参数 (self)
在调用时 就不能再 加 ()
例如 : 网页查询 时 的 分页 技术
装饰器的方法 创建 property 属性。
通过类属性的方法 来创建 property属性
名字重整,这样来达到隐藏 私有变量的效果,而非真的私有。
魔法属性和方法
- __doc__ , 可以查看类的描述信息 ,就是 类中 “”““”” 包含的内容。
- __module__ , 查看 这个 实例 是在哪个模块中定义的
- __class__ , 查看 这个实例 是由哪个模块中的哪个类 创建的。
- __init__ , 初始化方法,通过类创建对象时会 自动触发。
- __del__ , 当对象在内存中被释放时,自动触发执行,由Python解释器触发。
- __call__ , 当 实例对象() 时,会直接调用 这个方法的定义。
- __dict__ , 查看类或实例中的所有属性。
- __str__ , 当打印 或 拼接字符串时 , 会自动调用里面的内容。
with 和 上下文管理
Python中一切都是 对象。类也是对象。
globals() 查看 所有的全局变量引用。
.__dict__ 查看有哪些模块。
元类 创建类 。
类创建实例对象。
第二个参数为 继承的父类,第三个参数 可以 加 属性和方法。
元类是最顶层的了。
基本很少用。
一个应用元类的小示例:把属性都改为大写
通过元类 来 实现 ORM
实现向数据库插入数据的简单样例:
再升级,把基本的内容放到父类中