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

      

      

     

  • 相关阅读:
    多种方式实现数组的扁平化处理
    利用node中的内置模块fs实现对简单文件的读取 拷贝 创建等功能
    浅谈es5和es6中的继承
    js之冒泡排序与快速排序
    IE5,IE6,IE7,IE8的css兼容性列表[转自MSDN]
    css3 动画
    各种浏览器css hack
    解决li在ie,firefox中行高不一致问题
    Css:背景色透明,内容不透明之终极方法!兼容所有浏览器
    png-24在ie6中的几种透明方法
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/8546567.html
Copyright © 2011-2022 走看看