zoukankan      html  css  js  c++  java
  • 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中执行断点运行

     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Sigma Function (LightOJ
    Least Common Multiple (HDU
    七夕节 (HDU
    Goldbach`s Conjecture(LightOJ
    tarjan图论算法
    数论基础(更新中)
    You Are Given a Decimal String... CodeForces
    【UOJ#22】【UR#1】外星人
    【UOJ#21】【UR#1】缩进优化
    【BZOJ3242】【UOJ#126】【NOI2013】快餐店
  • 原文地址:https://www.cnblogs.com/alben-cisco/p/6901714.html
Copyright © 2011-2022 走看看