python 装饰器

开放封闭原则(OCP,Open Closed Principle)是所有面向对象的编程的原则核心,其思想是:

软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
因此,开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
模拟一个web页面:
 假设每个页面都是一个函数,用户登录首页就调用函数home_page,用户在home_page可以转换到子页,这里的子页用video_page来模拟。
 
代码如下:
def home_page():
    print ("welcome to home page" )

def video_page():
    print("welcome to video page")

现在对这个站点进行功能改造,要求用户在主页去访问子页的时候,要求进行一次验证,

在这里其实函数video_page()的功能就是展示页面,这里可以通过修改函数video_page()来完成这个需求!

代码如下:

def video_page():
    print("Login username and password !")
    print("welcome to video page")

这样在函数video_page在执行的时候,就会首先进行一次验证(这里print只是模拟验证)

如果子页很多,每个子页都修改这个导致代码凌乱(这个不是大问题,因为可以使用函数式编程)

 函数式代码b编程:

def login():
    print("Login username and password")

def home_page():
    print ("welcome to home page" )

def video_page():
    login()
    print("welcome to video page")

video_page()
View Code

但是这样不符合OCP原则,我们应该尽可能的在外部对函数进行扩展

代码:

def login(fun):
    print("Login username and password")
    return fun

def home_page():
    print ("welcome to home page" )
    
@login
def video_page():
    print("welcome to video page")

video_page()

在函数A之前通过@调用函数B,这个函数B就是装饰器。

这个@login其实就是等于:

video_page = login(video_page)

定义一个变量,变量中调用函数,函数中调用函数体

那么也就是说,不管有没有调用函数video_page(),这段代码都会运行“video_page = login(video_page)”

测试:

所以还得继续修改完善迭代器代码:

def login(fun):
    def inner():
        print("Login username and password")
        fun()
    return inner

def home_page():
    print ("welcome to home page" )

@login
def video_page():
    print("welcome to video page")

video_page()
View Code

具体执行过程,可以辅助代码到pyCharm中执行断点运行

 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/alben-cisco/p/6901714.html