python 装饰器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()
但是这样不符合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()
具体执行过程,可以辅助代码到pyCharm中执行断点运行
以上是关于python 装饰器的主要内容,如果未能解决你的问题,请参考以下文章