python编程范式

什么是面对对象编程?

  • OOP编程(面向对象)
  • 把对象作为基本单元,把对象抽象成类(class) 包含成员和方法
  • 数据封装,继承,多态
  • python中使用类来实现,过程式编程(函数),OOP(类)

组合与继承

  • 使用面对对象编程时,优先使用组合而非继承
  • 组合是使用其他类的实例作为自己的一个属性(Has-a) 关系
  • 子类继承父类的方法(Is-a 关系)
  • 优先使用组合保持代码简单

类变量与实例变量的区别

区别类变量和实例变量
  • 类变量由所有实例共享
  • 实例变量由实例单独享有,不同实例之间互不影响
  • 当我们需要在一个类的不同实例之间共享变量需要使用类变量
classmethod/starticmethod区别
  • 都可以通过class.method()的方法使用
  • classmethod第一个参数是cls,可以引用类变量
  • starticmethod使用起来和普通函数一样,只是放在类里面

什么是元类

  • 元类是创建类的类
  • 元类允许我们控制类的生成,比如修改类的属性等
  • 使用type来定义元类
  • 元类最常见的一个使用场景就是ORM框架
1
2
x = type('X',(object,),{'abc':123,'xx':'xx'})
print(x.xx

装饰器

  • 装饰器是接受函数作为参数,添加功能后返回一个新函数的函数(类)
  • 通过@使用
  • 类写装饰器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 一个简单的测算函数运行时间的装饰器
class LogTime:
def __init__(self, use_int=False):
self.use_int = use_int

def __call__(self, func):
def _log(*args, **kwargs):
beg = time.time()
res = func(*args, **kwargs)
print('use time:{},{}'.format(time.time() - beg, self.use_int))
return res
return _log
# 使用时需要加()
@LogTime()
def func():
time.sleep(1)

设计模式

创建型设计模式
工厂模式:解决对象创建问题
  • 解决对象创建问题
  • 解耦对象的创建和使用
  • 包括工厂方法和抽象工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
class Dog:
def speak(self):
print('wangwang')

class CatToy:
def speak(self):
print('miao miao')

def toy_factory(toy_type):
if toy_type == 'dog':
return Dog()
elif toy_type == 'cat':
return CatToy()
构造模式
  • 用来控制复杂对象构造
  • 创建和分离,比如你要买电脑,工厂模式直接把电脑给你
  • 但是构造模式允许你自己定义电脑配置,组装完成后给你
原型模式
  • 通过克隆原型来创建新的实例
  • 可以使用相同的原型,通过修改部分属性来创建新的实例
  • 用途:对于一些创建实例开销比较大的地方可以使用原型模式
单例模式
  • 单例模式:一个类创建出来的对象都是同一个
  • python的模块其实就是单例的,只会导入一次
  • 使用共享同一个实例的方式创建单例模式
1
2
3
4
5
6
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'):
_instance = super().__new__(cls,*args,**kwargs)
cls._instance = _instance
return cls._instance
结构型设计模式
装饰器模式
  • 无需子类化扩展对象功能
代理模式
  • 把一个对象的操作代理到另一个对象
适配器模式
  • 把不同对象的接口适配到同一接口
  • 想象一下多功能充电头
  • 当我们需要给不同对象同一接口的时候可以使用适配器模式
行为模式
迭代器模式
  • 通过统一的接口迭代对象
  • python内置对迭代器的使用
  • python里可以实现__next__ 和 __iter__实现迭代器
观察者模式
  • 发布订阅是一种最常用的实现方式
  • 发布订阅用于解耦逻辑
  • 可以通过回调等方式实现,当事件发生的时候,执行相应的回调函数

什么是闭包?

  • 绑定外部作用域的变量的函数
  • 即使程序离开外部作用域,如果闭包仍然可见,绑定变量不会销毁
  • 每次运行外部函数都会重新创建闭包
  • 闭包:引用外部自由变量的函数
  • 自由变量:不在当前函数定义的变量
  • 特性:自由变量和闭包函数同时存在