STUNUM

面有萌色,胸有丘壑。心有猛虎,细嗅蔷薇。

嗨,我是王鑫 (@stunum),一名 Python 开发者。


Python web开发,后端以Django框架为主,前端使用Vue.js...

python设计模式之装饰器模式

装饰器模式

意义:

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。

适用性
  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 处理那些可以撤消的职责。
  • 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
举例:
#函数装饰器
from functools import wraps
import time

def runtime(func):
    @wraps(func)
    def inner(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
    return inner

@runtime
def fun():
    time.sleep(2)
    print('ok')
#类装饰器
class RunTime(object):
    def __init__(self, func):
        self._func = func

    def __call__(self, *args, **kwargs):
        start_time = time.time()
        self._func(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)


@RunTime
def fun1(num):
    print(f'args={num}')
    time.sleep(2)
    print('ok')

ps:如果一个函数被多个装饰器装饰的话,装饰器的执行顺序是从内到外的。 举例:

@ClearFunc
@RunTime
def fun1(num):
    print(f'args={num}')
    time.sleep(2)
    print('ok')

上面这个函数被两个装饰器装饰了,运行的时候执行顺序是原函数先被 RunTime 装饰器装饰,之后装饰完的函数再被 ClearFunc 装饰。

最近的文章

python设计模式之外观模式

外观模式意义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。适用性: 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层...…

水滴石穿继续阅读
更早的文章

python设计模式之组合模式

组合模式意义:将对象组合成树形结构以表示“部分-整体”的层次结构。C o m p o s i t e 使得用户对单个对象和组合对象的使用具有一致性。适用性: 你想表示对象的部分-整体层次结构。 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。举例:class ComponentBases(object): def __init__(self, name): slef.name = name def add(self, obj): ...…

水滴石穿继续阅读