基础
1. 实例方法(instance method),类方法(class method)与静态方法(static method)区别
- 实例方法是类实例后的带self参数的普通方法。类方法和静态方法都是通过函数装饰器的方式实现的;类方法需要传入cls参数,静态方法无需传入self参数或者是cls参数(但不等同于不能传入参数) 调用实例方法时,self指向实例对象。
- 类方法是以cls 为参数的方法,使用装饰器classmethod,调用类方法,类方法可以通过类对象或者实例对象调用。如果是通过实例对象调用的,那么实例对象会被忽略,而是转而通过其类对象进行调用。类对象,会以参数形式传给类方法(点语法),作为类方法的第一个参数,也就是cls参数。
- 当通过类对象调用静态方法时,这里的结果与通过实例对象调用是完全一样的。通过实例对象调用静态方法时,实例对象也会被忽略,而是通过其类对象进行调用,这一点与类方法的调用是一样的。
- 类方法调用无需创建实例,所以比较灵活,为了修改类内部的一些数据。
- 静态方法类似类的工具,通过类对象或者实例对象调用,被束缚在类对象中,将相关处理逻辑束缚在对象体内,便于维护与测试,会更好。
2. python copy and deepcode
copy 是引用拷贝,指重新分配一个内存,创建新对象,元素是原对象的各个子对象的引用,若子对象不可变没有影响,若为set,dict,list 则会出现一些问题,深拷贝是全对象拷贝,分配内存,创建新对象,将原对象的元素以递归的形式拷贝到新对象中,因此新对象跟原对象没有任何关联了。
3. 进程、线程、协程。
- 进程是资源分配的最小单位。单核cpu可以实现多进程,只不过是并发的形式,在任意时间点上只有一个程序在cpu上运行。进程拥有自己的地址空间、全局变量等各种资源。操作系统通过调度cpu执行进程的记录,回复、切换。并行时多核cpu多进程运行。
- 线程是程序执行过程中最小单元。一个进程可以有多个线程,线程共享大部分资源,并参与cpu等调度,由于线程与线程之间某些资源是独占的,所以会导致锁的问题,例如GIL。(gil是一种互斥锁,cpython是基于栈的解释器来运行字节码,在cpython中抢夺线程资源时,会破坏解释器的状态,类似引用计算)不同线程中访问同一个对象,也是需要加锁的,不然还是会被破坏。
- 协程 ,又称微线程,协程是用户态的轻量级线程。协程是函数控制的,协程拥有自己的上下文和栈,协程切换调度的时候,将上下文跟栈保存在其他地方,到切换回来的时候,恢复先前保存的寄存器的上下文和栈。协程能保持上一次调用的状态,每次重载之后接着处理上一次离开时的逻辑。避免线程切换,开销小。无需原子操作锁定以及同步的开销,内存占用小。方便切换、并且可控。
4. sorted vs list.sort
- sorted 是复制iterable 可迭代对象,然后进行排序,所以会返回参数
- list.sort 是在原来对象上操作排序,不需要接受返回参数。
- sort 通过 key的关键词来排序,key可接受单个对象或者tuple
5. is vs id vs ==
- id 是生命周期内对象的可代表内存值。
- is 是比较对象是否引用对象是否一致,类似内存是否指向同一个位置,,取这个对象的全部内容进行比较,不只是id。例如内置的_ _ hash _ _方法。
- == 只是对比值是否一样。_ _ eq _ _
6. map vs reduce vs filter
- map(function,*sequence) 将迭代内容的元素作为一个个轮训参数传入函数进行调用, 返回迭代器。
- reduce(function,*sequence) 将迭代内容的参数,依次传入,汇总结果,返回单个对象/结果。
- filter(function,*sequence) 参考map,返回迭代器。将里面的元素进行筛选。
7. 单例
- 装饰器实现
- 类实现
def singleton(cls):
_instance={}
def inner():
if cls not in _instance:
_instance[cls]=cls()
return _instance[cls]
return inner
class Singleton:
def __new__(cls,*arg,*kw):
if not hasattr(cls, '_instance'):
cls._instance=super(Singleton,cls).__new__(cls,*arg,*kw)
return cls._instance
class Singleton:
def __init__(self,cls):
self.cls=cls
self._instance={}
def __call__(self,*arg,*kw):
if self.cls not in self._instance:
self._instance[self.cls]=self.cls
return self._instance[self.cls]