1.可变与不可变类型;
不可变类型(数字、字符串、元组、不可变集合)不可变类型不能被修改。
可变类型(列表、字典、可变集合)。
2.__new__() 与 __init__()的区别;
_new_作用于_init_之前。前者可以决定是否调用后者,或者说可以决定调用哪个类的_init_方法。
首先要知道在面向对象编程中,实例化基本遵循创建实例对象、初始化实例对象、最后返回实例对象这么一个过程。
Python 中的 _new_ 方法负责创建一个实例对象,_init_ 方法负责将该实例对象进行初始化。
3.设计模式相关知识
单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点,例如框架中的数据库连接
装饰器模式:不修改元类代码和继承的情况下动态扩展类的功能,例如框架中的每个controller文件会提供before和after方法。
迭代器模式: 提供一个方法顺序访问一个聚合对象中各个元素,在PHP中将继承 Iterator 类。
命令模式: 将”请求”封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作。
4.装饰器相关知识
装饰器是一个函数,这个函数的主要作用是包装另一个函数或类。包装的目的是在不改变原函数名的情况下改变被包装对象的行为。接收一个函数,内部对其包装,然后返回一个新函数,这样子动态的增强函数功能;通过高阶函数传递函数参数,新函数添加旧函数的需求,然后执行旧函数。
使用装饰器单例属性不会被覆盖。因为装饰器单例模式是直接返回之前生成的对象,并不会重新初始化对象。像new方法构建的单例模式会重新调用init方法,为实例重新初始化属性。
5.垃圾回收机制相关知识
垃圾回收:python解释器对正在使用的对象保持计数,当某个对像的引用计数降为0时,垃圾收集器就可以释放该对象,获取分配的内存。当分配对象和取消分配对象的差值高于阈值时垃圾回收才会启动。
分代回收:python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。垃圾回收启动时,一定会扫描所有的0代对象。
如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。
6.多进程与多线程知识点
多线程:在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程共享内存空间;进程的内存是独立的,同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现,一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程。进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET。
多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源。
多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能造成整个进程的崩溃,因为它们共享了进程的内存资源池。
7.协程知识点
高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理协程能保留上一次调用时的状态,管是进程还是线程,每次阻塞、切换都需要陷入系统调用,使用线程时需要非常小心地处理同步问题,而协程完全不存在这个问题。