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

"开放-封闭"原则

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

需求:

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

文件:

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. VB程序逆向常用的函数

    本文转载!!! 原文地址:http://www.cnblogs.com/bbdxf/p/3780187.html 1) 数据类型转换: a) __vbaI2Str    将一个字符串转为8 位(1个字 ...

  2. Redi缓存注意事项

    缓存使用的场景 在一个高频访问的应用系统中,每次用户的请求需要去存储中获取数据,会对数据库造成很大的压力.容易导致数据库的奔溃.所以才会出现缓存来分担一部分的数据库的压力. 具体会产生数据库访问压力的 ...

  3. 【Linux杂记】screen命令

    screen命令: 解决的问题:有些进程启动后,一旦断开ssh容易断掉,所以新建一个screen(可以理解成窗口)并行运行 守护进程的方式:linux守护进程的方式实现开机启动某些特定的程序 屏幕命令 ...

  4. Spring Boot 整合 Freemarker,50 多行配置是怎么省略掉的?

    Spring Boot2 系列教程接近完工,最近进入修修补补阶段.Freemarker 整合貌似还没和大家聊过,因此今天把这个补充上. 已经完工的 Spring Boot2 教程,大家可以参考这里: ...

  5. 玲珑OJ 1083:XJT Love Digits(离线处理+哈希)

    http://www.ifrog.cc/acm/problem/1083 题意:比较好懂.注意答案的x不包含ax本身,所以才输出-1. 思路:离线处理.根据x排序,然后每次更新Hash[]数组就好了. ...

  6. vue的基本用法和指令

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. linux修改时间显示格式

    1. 问题描述 Linux下经常使用 "ls - ll"命令查看文件夹或文件创建及权限信息,但是满屏的Mar .May.Jul有点小难受. 2. 解决方案 修改bash_profi ...

  8. Java底层技术系列文章-总揽

    对于工作中经常用到的东西,还是多看看实现原理,这样用着才能放心. 源码思想学习计划: 1.java基础库  HashCode深入理解 java线程框架窥探 2.集合类     java枚举类使用 递归 ...

  9. android_layout_framelayout

    framelayout最大的特点,个人认为就是N个元素都会重叠地堆在左上角,除非你手动指定位置.相对布局relative也是如此,但是他妈的人家不可以指定布局的垂直与水平,frame可以,但是指定垂直 ...

  10. Jenkins Ci系列目录

    Jenkins入门篇 1.Jenkins入门之界面概览 2.Jenkins入门之新建任务 3.Jenkins入门之导航操作 4.Jenkins入门之任务基本操作 5.Jenkins入门之执行Power ...