风-fmgao

导航

装饰器原理

原理:
原有函数:
    def fun_1()

正常调用原有函数:
    fun_1()

现有需要需要在原有函数基础上添加新功能,但是不改变原有函数

法一:

    1、添加新函数(装饰一波)
    def fun_2(fun_1):
        # 嵌套函数。返回函数地址(fun_3 ),调用时才执行
        def fun_3():
        return fun_3                

    2、现在调用方式
        # 装饰
        fun_1 = fun_2(fun_1) # 先执行右边(外函数执行,返回一个内函数地址),再复制给左边(内函数地址)
        # 调用
        fun_1()

法二:
    注解方式
    @fun_2

 

示例(带参数):
user_status = False # 用户登录了就把这个改成True
def login(func):  # henan
    def inner(*arg, **kwargs):
        _username = 'alex'  # 假装这是DB里存的用户信息
        _password = 'abc!123'  # 假装这是DB里存的用户信息
        global user_status
        if user_status == False:
            pass
        else:
            print("用户已经登录,验证通过")
        if user_status:
            func(*arg, **kwargs)
    return inner
        

def home():
    print('---------首页-----------')        
    
def america():
    print('---------欧美专区-----------')        
    
def japan():
    print('---------日韩专区-----------')        
    
    
#@login  # henan = login(henan)  #inner
def henan(style):    
    print('---------河南专区-----------', style)
   
henan = login(henan)    # inner
print(henan)    

#  调用
henan('3p')  # inner()

 

示例2

user_status = False # 用户登录了就把这个改成True
def login(auth_type):  # qq
    def outer(func):  # henan
        def inner(*arg, **kwargs):  # 3p
            _username = 'alex'  # 假装这是DB里存的用户信息
            _password = 'abc!123'  # 假装这是DB里存的用户信息
            global user_status
            if user_status == False:
                username = input('user:')
                password = input('password:')
                if username == _username and password == _password:
                    print('welcome login....')
                    user_status = True
                else:
                    print('wrong username or password')
            else:
                print("用户已经登录,验证通过")
            if user_status:
                func(*arg, **kwargs)
        return inner
    return outer
    
    
#henan = login('qq')  # outer
#print(henan)    
#r = henan('3p')  # inner
#print(r())

xx = login('qq')
print(xx)
henan = xx(henan)
print(henan)
henan('3p')

'''
xx = login('qq')
print(xx)
henan = xx(henan)
print(henan)

<==> @login('qq')
'''

posted on 2018-05-20 10:22  风-fmgao  阅读(114)  评论(0编辑  收藏  举报