装饰器和"开放-封闭"原则

"开放-封闭"原则

  • 软件开发中的“开放-封闭”原则,它规定已经实现的功能代码不应该被修改,但可以被扩展,即:
  • 封闭:已实现的功能代码块不应该被修改
  • 开放:对现有功能的扩展开放

需求:

编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件)
要求登录成功一次,后续的函数都无需再输入用户名和密码

文件:

test10.txt

False,alex,abc123

程序:

import time
def save_back_to_filr(f, line):
    import os
    f_name = f
    f_name_new = "%s.new" %f_name
    f = open(f_name, "r", encoding="utf-8")
    f_new = open(f_name_new, "w", encoding="utf-8")
    for line in f:
        new_line = line.replace("False", "True")
        f_new.write(new_line)
    f.close()
    f_new.close()
    os.replace(f_name_new,f_name)

def run_time(func):
    def inner():
        start = time.time()
        func()
        total_times = time.time()-start
        print(f"Total run_times:{total_times}s")
    return inner

def login(func):
    def inner():
        f = open("test10_data.txt", "r", encoding="utf-8")
        line = f.readline()
        f.close()
        if "False" in line:
            username = input("Username:").strip()
            password = input("Password:").strip()
            if username in line and password in line:
                print("登录成功.....")
                line = line.replace("False","True")
                save_back_to_filr("test10_data.txt", line)
                #func()
            else:
                print("wrong username or password")

        if "True" in line:
            func()
    return inner

def menu():
    print("----首页-----")

@login
@run_time
def func1():
    print("----欢迎使用func1函数----")
    time.sleep(1)

@login
@run_time
def func2():
    print("----欢迎使用func2函数----")
    time.sleep(1)

@login
@run_time
def func3():
    print("----欢迎使用func3函数----")

menu()
func1()
func2()
func3()

@login 这个符号用在功能函数func1前,相当于 func1 = login(func1)

此时 @login装饰func1函数,即所谓的装饰器

只不过,这用了两个装饰器,@login和@run_time

装饰器就是通过闭包达到不改变源代码,来拓展函数应用功能的

装饰器和"开放-封闭"原则的更多相关文章

  1. Python——day12 nonlcoal关键字、装饰器(开放封闭原则、函数被装饰、最终写法)

    一.nonlocal关键字 1.作用:将L与E(E中的名字需要提前定义)的名字统一 2.应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值 def outer(): num=10 print ...

  2. 【Python入门学习】闭包&装饰器&开放封闭原则

    1. 介绍闭包 闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure) 例如:如果在一个内部函数里:func2()就是内部函数, 对在外部 ...

  3. Day 12 开放封闭原则,装饰器初识

    nonlocal关键字 # 作用:将 L 与 E(E中的名字需要提前定义) 的名字统一​# 应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值​# 案例:​def outer():    n ...

  4. DAY 13 开放封闭原则

    装饰器: 即是用一个函数去拓展另一个函数,同时遵循开放封闭原则 开放封闭原则 对修改关闭,对拓展开放 不允许修改源代码以及调用方式 以下是无参函数的基本格式 def outer(func): def ...

  5. Day 12 装饰器,开发封闭.

    一.什么是装饰器 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事务 ...

  6. 开放封闭原则(Open Closed Principle)

    在面向对象的设计中有很多流行的思想,比如说 "所有的成员变量都应该设置为私有(Private)","要避免使用全局变量(Global Variables)",& ...

  7. 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则

    单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...

  8. 开放封闭原则(OCP)

    开放封闭原则 转:http://baike.baidu.com/view/2493421.htm转:http://dev.csdn.net/article/38/38826.shtm 开放封闭原则(O ...

  9. Chapter 4.开放-封闭原则

    开放-封闭原则:是说软件实体应该可以扩展,但不可修改. 设计人员必须对于他设计的模块应该对哪种变化封闭做出选择,先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化. 面对需求,对程序的改动是通 ...

随机推荐

  1. python-基本数据类型(int,bool,str)

    一.python基本数据类型 1. int ==>  整数. 主要⽤用来进⾏行行数学运算 2. str ==> 字符串串, 可以保存少量量数据并进⾏行行相应的操作 3. bool==> ...

  2. Python|网页转PDF,PDF转图片爬取校园课表~

    import pdfkit import requests from bs4 import BeautifulSoup from PIL import Image from pdf2image imp ...

  3. RequestMappingHandlerAdapter和RequestParam原理分析

    我们要使用定义了RequestMapping方法或者类是,需要先准备好所需要的参数.如何准备参数,我们应该考虑些上面问题. 都有哪些参数需要绑定? 除了方法确定的参数,还有两个方法的参数需要绑定,那就 ...

  4. MyBatis从入门到精通(二):MyBatis XML方式的基本用法之Select

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. 明确需求 书中提到的需求是一个基 ...

  5. C语言-main方法的两个参数是干什么的?

    大家都知道C语言的main方法怎么写的吧!但你们知道mian方法里的参数的含义吗? 代码如下: int main(int argc,char *argv[]){ //argc是传进的参数个数 //ar ...

  6. Android前沿技术

    一.热升级Tinker源码解析与手写二.热修复阿里百川Sophix内核原理三.App Instantgoogle8.0 类似热更新技术原理与实战四.强制更新1.银行应用非对称加密对称加密五.组件化框架 ...

  7. 关于vue项目中在js中引入图片问题

    <template> <div> <img v-for="(star,index) in stars" :src="star.src&quo ...

  8. H5 离线缓存的用法

    H5离线缓存基础系列   1.什么是离线缓存 离线缓存:离线缓存可以将站点的一些文件缓存到本地,它是浏览器自己的一种机制,将需要的文件缓存下来,以便后期即使没有连接网络,被缓存的页面也可以展示. 2. ...

  9. Oracle insert all用法简介

    insert all是oracle中用于批量写数据的 现在直接通过例子学习一下,比较简单直观,例子来自<收获,不止SQL优化>一书 环境准备 create table t as selec ...

  10. 13 | 效率为王:脚本与数据的解耦 + Page Object模型