- 创建对象
- 语法
- class a():
- obj=a()
- 魔法方法 - OOP内置方法
- init(self):
- 对象初始化,类似Java中的构造方法,在init初始化方法中完成对对象属性的赋值.
- self 谁调用那么self就代表哪个对象(指向谁)类似JS中的this和Java中的this 指向
- 对象不需要创建类型变量,直接在init方法中传入,就可生成对象属性
- str(self):
- 没有实现str方法时,打印对象,会直接打印obj的内存地址
- 实现str后,打印对象会打印str方法的返回值内容
- 类似Java的object.tostring()方法,重写此方法可以获得指定的tostring格式化输出对象
- del()
- 直接删除这个对象,这个对象所拥有的所有资源全部被释放,不再拥有任何数据
- 当变量保存了一个对象的引用的时候,这个对象的引用计数就会加1
- 当del()删除的变量指向这个对象的时候,则会减少对象的引用计数,如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0时,对象才会被真正的GC内存被回收
- init(self):
- 面向对象特点
- 继承
- python中所有类默认继承object类,object类是顶级类,所有类的父类,其他子类叫做派生类
- 多继承重名规范
- python支持多继承,一个子类可以拥有多个父类,也继承了所有父类的数据和方法
- 如果多个父类中有同名的属性和方法,则默认使用第一个父类属性和方法
- 多个父类中不重名的属性和方法不会有任何影响
- 子类重写父类同名方法,默认情况下调用子类重写的方法,如果子类没有重写则调用父类的
- 子类如何选择父类属性和方法
- 类中的self永远表示子类自己的引用
- 多重继承中如果要选择自己想要的属性,则要选择性初始化,这样就会获得选择的父类的初始化属性
- 子类中的init方法如果不用self进行初始化,就会被父类的属性所替换
- Spuper
- 语法
- super().方法
- 只能调用父类的方法,不能调用属性
- super(这个类的类名,self) 用法一样,就是写的清楚一点
- super会自动寻找父类,逐一链式调用所有父类的方法,并且只执行一次,调用顺讯遵循mro,子类继承父类的先后顺序
- 如果继承了多个父类,并且父类都有同名方法,默认只执行第一个父类的方法,super不支持调用多个父类同名方法
- 重点
- 所有被调用的方法都只执行一次
- 语法
- 直接选择父类属性
- 多重继承可以直接使用父类类型调用来完成子类属性和方法的选择和重写
- 继承
- 私有属性
- 语法 两个__
- 被修饰的变量和方法子类无法被继承
- 被修饰的变量和方法不能被对象访问
- 类属性
- 定义
- 所有的类共同拥有一份一致的类属性,并且只有一份内存空间会存储
- 可以通过类对象,和实例对象访问类属性
- 定义
- 装饰器
- @classmethod
- 被注解修饰的方法参数第一个必须是类对象,简写cls
- 定义为类方法,可以获取类的私有属性,其实没啥用,get方法就可以访问到类属性干啥多一个classmethod类方法,脱裤子放屁
- 实例对象,类都可以访问到类方法
- @classmethod
- 静态方法
- @staticmethod
- 静态方法不需要传递类对象或者实例对象
- 取消不必要的参数传递,减少性能的消耗
- @staticmethod
- 语法
- 特点
- 多态
- 对象/类向上转型,有一个统一的规范接受子类实例化对象
- 封装
- 将内部方法封装,外界的访问会导致内部逻辑和数据的不安全,使用私有化属性修饰,并提供统一的外部接口提供访问
- 继承
- 继承的好处的代码的重用,并且易于理解
- 多态
- 类属性_mro_
- mro理解
- mro是类继承顺序
- super不是父类,而是mro顺序中的下一个类
- 多重继承算法
- py2.2之前的使用深度优先,对于正常继承顺序友好,但是对交叉继承(菱形)继承 不友好,找不到同一层广度更深的同名方法
- py2.2-py3之间使用的是广度优先,对于交叉继承友好,但是对正常顺序继承不友好,找不到同层更深度的同名方法
- py3 之后使用的c3算法,c3算法结合了广度优先和深度优先的优点,面对正常继承顺序使用深度优先,面对交叉继承使用深度优先
- mro理解
进程
- 概念
- 进程是计算机资源分配的最小单位,是操作系统进行资源分配和调度的基本单位
- 线程是计算机操作系统程序执行的最小单位
- 进程创建后会自动创建最少一个线程,因为进程创建后分配的资源不会改变,那么为了避免进程浪费资源就有了线程,通过对CPU时序的利用,高效利用进程中的所有资源,并且线程共享父进程中的所有资源
- 并发&并行
- 并发
- 通过CPU时序,利用多线程实现任务伪同时操作
- 交替执行多任务
- 并行
- 操作系统通过调用CPU多核心,进行多任务同时执行操作
- 真正同时执行多任务
- 并发
- 流程
- 导入头文件
- import multiprocessing
- 创建进程对象
- obj=multiprocessing.Process(target=函数名,args=(),kwargs={})
- obj.start() 启动进程
- 进程守护
- 主进程关闭后不在等待子进程,直接关闭子进程. 如果不设置进程守护主进程就会等待子进程执行完毕后才结束
- obj.daemon=True
- multprocessing.Process(target=函数名,daemon=True)
- 进程PID
- 获取进程编号
- os.getpid
- 获取父进程编号
- os.getppid
- 杀死进程
- os.kill(pid,方式) 一般9 直接杀死
- 如果在子进程中杀死自己的父进程,那么子进程会跟随父进程一起销毁
- 获取进程编号
- 销毁进程
- 进程对象.terminnate()
- 全局变量
- 进程之间不共享全局变量,因为两个进程之间已经是不同的资源,即使有同名的变量 也只是变量名一样而已,与父子进程关系无关
- 进程间通信可以使用文件传递信息
- 导入头文件
线程
- 概念
- 线程是操作系统执行任务的最小单元
- 使用
- 头文件
- import threading
- 创建对象
- obj=threading.Thread(traget=函数名)
- 传参与进程一致
- 易错点
- 如果参数只有一个那么使用args传参时要这样写args=(1,) 如果不写逗号,编辑器默认是其为逻辑运算的括号而不是元祖类型
- 启动线程
- obj.start()
- 线程守护
- daemon=True 参数中设置或者是obj.setDaemon
- 作用
- 主线程执行结束后,子线程立即结束,不管子线程是否执行完毕
- join
- 阻塞调用处线程执行结束
- 子线程调用处的父线程会等待子线程执行结束再结束执行
- 死锁
- 两个线程都等待对方释放相同资源
- 死锁产生条件
- 互斥条件: 多个条件使用同一个资源, 资源不能共享,同时只能满足一个线程使用
- 循环等待条件: 若干个线程或者进程形成环形链,每个都占用对方申请的下一个资源
- 请求与保持条件: 进程或者线程已获得一些资源, 但因请求其他资源被阻塞时,对已获得资源保持不放
- 互斥锁
- mutex=threading.Lock()
- mutex.acquire
- mutex.relase
- 头文件
TCP/UDP/HTTP网络协议
- 端口
- 概念
- 数据传输的通道
- 端口号
- 端口的ID
- 0-65536
- 分类
- 固定端口号
- 0-1023
- 动态端口号
- 1024-65535
- 固定端口号
- 概念
- socket
- 网络数据传输协议
- 分类
- TCP
- 语义准确送达
- UDP
- 语义普通送达
- TCP
- 特点
- TCP
- 面向连接
- 通信之前需要三次握手建立连接
- 可靠
- 发送应答机制,保证准确送达不丢包
- 基于字节流
- 超时重传,错误校验,流量控制
- 面向连接
- 客户端流程
- 创建socket
- tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- 参数1:ipv4
- 参数2:tcp通讯方式
- 连接服务端(三次握手)
- tcp_client_socket.connect((“ip”,port))
- 发送数据 send 二进制
- tcp_client_socket.send(“nihaome”.encode(encoding=“utf-8”))
- 接收数据 recv接收数据
- recv_data = tcp_client_socket.recv(1024)
- 参数:接收数据大小 单位字节
- recv方法是阻塞方法,等待服务端发送数据
- 如果数据比较大,需要循环recv直到读取完成
- 关闭连接close 四次握手 全双工模式,每一个都需要两次确认
- tcp_client_socket.close()
- 创建socket
- 服务端创建流程
- 创建socket
- tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- 绑定ip和端口
- tcp_server_socket.bind(("", 8888))
- 不写ip默认是本机localhost
- 设置监听模式(被动模式)
- tcp_server_socket.listen(128)
- 监听客户端上限
- accept等待客户端连接(阻塞方法)
- conn_socket, ip_port = tcp_server_socket.accept()
- 发送数据
- conn_socket.send(“客户端你的数据我收到了”.encode())_
- 接收数据
- recv_data = conn_socket.recv(1024)
- 关闭连接(1.关闭和各个客户端连接 2.关闭创建socket客户端不能再连接)
- conn_socket.close()_
- tcp_server_socket.close()
- 创建socket
- 通讯模式
- 单工模式
- 只能发送或者接受数据
- 半双工模式
- 可以收发数据,同一时刻只能执行收或者发数据操作
- 全双工模式
- 可以收发数据,并且可以同时进行收发数据,TCP全双工工作模式
- 单工模式
- 服务端设置地址复用
- tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
- 只有一个ip地址而有多种服务模式时,开启地址复用,因为协议和端口号不同所以相互之间没有影响
- socket链接断开后,recv会解开阻塞不在等待,接收到空字符串,默认为关闭连接口令
- TCP