Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的。
对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收)。
对可变类型列表,字典.变量名存储的是一个地址,该地址指向一个具体的对象,并且不管对变量的值即对象做怎么样的操作,都不会改变变量名存储的地址。
_new_作用于_init_之前。前者可以决定是否调用后者,或者说可以决定调用哪个类的_init_方法。
首先要知道在面向对象编程中,实例化基本遵循创建实例对象、初始化实例对象、最后返回实例对象这么一个过程。 Python 中的 _new_
方法负责创建一个实例对象,_init_ 方法负责将该实例对象进行初始化;
单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点,例如框架中的数据库连接
装饰器模式:不修改元类代码和继承的情况下动态扩展类的功能,例如框架中的每个controller文件会提供before和after方法。
迭代器模式: 提供一个方法顺序访问一个聚合对象中各个元素,在PHP中将继承 Iterator 类
命令模式: 将”请求”封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作.
[expr for iter_var in iterable] 列表推导式是将所有的值一次性加载到内存中
(expr for iter_var in iterable)
在大数据量处理时,生成器表达式的优势就体现出来了,因为它的内存使用方式更好,
效率更高,它并不创建一个列表,只是返回一个生成器。
装饰器是一个函数,这个函数的主要作用是包装另一个函数或类
包装的目的是在不改变原函数名的情况下改变被包装对象的行为。
接收一个函数,内部对其包装,然后返回一个新函数,这样子动态的增强函数功能
通过高阶函数传递函数参数,新函数添加旧函数的需求,然后执行旧函数。
垃圾回收:python解释器对正在使用的对象保持计数,当某个对像的引用计数降为0时,垃圾收集器就可以释放该对象,获取分配的内存。当分配对象和取消分配对象的差值高于阈值时垃圾回收才会启动。
分代回收:python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。垃圾回收启动时,一定会扫描所有的0代对象。 如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。
多线程:在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程共享内存空间;进程的内存是独立的,
同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现,
一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程
优缺点:1.多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。
但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源。
2.多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能
造成整个进程的崩溃,因为它们共享了进程的内存资源池。
*CPU密集型适合用多进程开发
TCP协议: (在传输之前先建立连接)面向连接(的通信服务):可靠地数据传输,失序,无差错,无丢失,无重复
用途:适用于传输内容比较大,网络情况比较好,需要提供准确的情况.比如:聊天信息,文字传输,邮件传输。
udp 协议:面向无连接的服务,不可靠,发送时由发送端自主进行,不考虑接收端。
用途:适用于网络较差,对传输准确性要求低,广播组播.比如:视频会议,广播数据。三次握手: 1.客户端向服务器发起链接请求(问是否可以连接) 2.服务器接受到请求后进行确认(允许连接)返回报文 3.客户端收到许可,建立连接 四次挥手: 1.主动方发送报文告知被动方要断开连接 2.被动发返回报文没告知收到请求,准备断开 3.被动发发送报文给主动方告知准备就绪可以断开 4.主动方发送报文确定断开