zoukankan      html  css  js  c++  java
  • 装饰器

    软件开发中的一个原则:开放-封闭原则。

    封闭:已实现的功能代码块不应该被修改

    开放:对现有功能的拓展开放。

    函数也是一个对象,函数对象可以赋值给一个变量,所以,通过变量也可以调用函数。

    函数对象有一个__name__属性,可以得到函数的名字。

    在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。本质上,装饰器就是一个返回函数的高阶函数。

    def func():
        print("so good")
    name = func
    name()
    print(func.__name__)
    print(name.__name__)

      下面两个输出结果为:  func

     

    user_status = False   
    def login(func):   #func是内存地址
        user_name = "alex"
        password = "123"
        global user_status
    
        if user_status == False:
            user_name = input("请输入用户名:")
            password = input("请输入密码:")
            if user_name == "alex" and password == "123":
                print("欢迎登陆")
                user_status = True
            else:
                print("用户名或密码错误")
        if user_status == True:   
            func()
    
    
    def home():
        print("---首页---")
    def america():
        # login()    #不能在函数内部调用,可能会出错。不符合开放封闭原则。
        print("---欧美专区---")
    def japan():
        print("---日韩专区---")
    def henan():
        # login()
        print("---河南专区---")
    america = login(america)
    henan = login(henan)    #不经过调用也会直接执行了函数,我们需要的是用户调用时才执行。

    下面引入了嵌套函数

    user_status = False
    def login(func):
        def inner():
            user_name = "alex"
            password = "123"
            global user_status
    
            if user_status == False:
                user_name = input("请输入用户名:")
                password = input("请输入密码:")
                if user_name == "alex" and password == "123":
                    print("欢迎登陆")
                    user_status = True
                else:
                    print("用户名或密码错误")
            if user_status == True:   
                func()
        return inner   #返回inner函数的地址
    
    def home():
        print("---首页---")
    def america():
        # login()    
        print("---欧美专区---")
    def japan():
        print("---日韩专区---")
    @login   #等同于 henan = login(henan)
    def henan():
        # login()
        print("---河南专区---")
    henan() 
    

      

      

     

  • 相关阅读:
    面试题目以及注意事项
    jQuery Ajax 实例 ($.ajax、$.post、$.get)
    前端知识大全
    jquery实现2级联动
    [转]那些年我们一起清除过的浮动
    使用kubeadm在CentOS上搭建Kubernetes1.14.3集群
    企业优秀运维人员20道必会iptables面试题
    通过nginx日志利用shell统计日pv和uv
    php访问mysql接口pdo-mysql安装
    何查看已经安装的nginx、apache、mysql和php的编译参数
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/8546567.html
Copyright © 2011-2022 走看看