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() 
    

      

      

     

  • 相关阅读:
    Go语言之深入剖析slice
    docker-compose 安装以及遇到的错误解决
    linux 简单记录9 --服务的访问控制列表(ssh,scp,screen)
    linux 简单记录8 --iptables 与 firewalld 防火墙
    linux 简单记录7--使用 RAID 与 LVM 磁盘阵列技术(使用LVM扩展磁盘空间)
    linux 简单记录6--存储结构与磁盘划分
    DNS 域名解析服务
    linux运用软链接解决目录空间不足
    linux 简单记录5--用户身份与文件权限
    ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/8546567.html
Copyright © 2011-2022 走看看