装饰器

定义:本质是函数,装饰其他函数

原则:

  • 不能修改被装饰的函数源代码
  • 不能修改被修饰的函数调用方式

实现:

  1. 函数即变量
  2. 高阶函数(把一个函数名当做实参传给另一个,从而实现不修改源代码来添加功能;返回值包含函数名,从而不修改函数的调用方式)
  3. 嵌套函数
import time
def timer(fun):
    def deco(*args,**kwargs):
        start=time.time()
        fun(*args,**kwargs)
        stop=time.time()
        print("time =%s"%(stop-start))#记录运行时间功能
    return deco#返回的是内存地址
@timer#t=timer(test2)()
def test2(name):
    time.sleep(2)
    print("in the test2:",name)
test2("hello")
decorator

装饰器就是给源代码添加功能,同时有不修改源代码和调用方式。

功能也可以添加多种,在函数上存在嵌套,如下图:

#_*_coding:utf-8_*_


user_status = False #用户登录了就把这个改成True

def login(auth_type): #把要执行的模块从这里传进来
    def auth(func):
        def inner(*args,**kwargs):#再定义一层函数
            if auth_type == "qq":
                _username = "alex" #假装这是DB里存的用户信息
                _password = "abc!23" #假装这是DB里存的用户信息
                global user_status

                if user_status == False:
                    username = input("user:")
                    password = input("pasword:")

                    if username == _username and password == _password:
                        print("welcome login....")
                        user_status = True
                    else:
                        print("wrong username or password!")

                if user_status == True:
                    return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能
            else:
                print("only support qq ")
        return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数

    return auth

def home():
    print("---首页----")

@login('qq')
def america():
    #login() #执行前加上验证
    print("----欧美专区----")

def japan():
    print("----日韩专区----")

@login('weibo')
def henan(style):
    '''
    :param style: 喜欢看什么类型的,就传进来
    :return:
    '''
    #login() #执行前加上验证
    print("----河南专区----")

# home()
# america = login(america) #你在这里相当于把america这个函数替换了
#henan = login(henan)

# #那用户调用时依然写
# america()
# japan()
henan("3p")
高级一点的装饰器

 

 

posted @ 2017-04-28 15:49  Leon_online  阅读(102)  评论(0编辑  收藏  举报