装饰器

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

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

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

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

函数对象有一个__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() 

  

  

 

posted @ 2018-03-12 22:58  Roc_Atlantis  阅读(104)  评论(0编辑  收藏  举报