python函数第3天(day 22)

装饰器

  可调用对像like函数。

本质是函数,被装饰的对像也是函数。修改对像的方法,并且,不改变被装饰函数的代码。

无参装饰器

#为什么要用装饰器及开放封闭原则

#什么是装饰器
# import time
# def timmer(func):
#     def wrapper(*args,**kwargs):
#         start=time.time()
#         res=func(*args,**kwargs)
#         stop=time.time()
#         print('run time is %s ' %(stop-start))
#     return wrapper
#
#
# @timmer
# def index():
#     time.sleep(3)
#     print('welcome to oldboy')
#
# index()





#装饰器
# import time
#
# @home     #home=名字(home)
# def home():
#     time.sleep(3)
#     print('welcome to oldboy')
#
# index()


# def get(url):
#     def index():
#         return urlopen(url).read()
#     return index


import time
def timmer(func): #func=home函数地址,python的变量没有储值功能,只是绑定关系
    def wrapper():
        # print(func)
        start_time=time.time()
        func()
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
    return wrapper



@timmer   # index=timmer(index)只要见到装饰器就会有这嘛个操作过程
def index():
    time.sleep(3)
    print('welcome to oldboy')

@timmer
def home(name):
    time.sleep(2)
    print('welcome to %s home page' %name)

# def my_max(x,y):
#     print('from my_max func')
#     return x+y

# index()  #--=--->wrapper()
home('dragon')
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        func(*args,**kwargs) #home(name)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
    return wrapper

@timmer #home=timmer(home)
def home(name):
    time.sleep(2)
    print('welcome to %s home page' %name)




@timmer  #auth=timmer(auth)
def auth(name,password):
    print(name,password)

@timmer
def tell():
    print('-=----------')
代码执行到def只要没有函数的调用()函数体里的东西都不执行,所以执行home()这个函数就相当于执行home=timmer(home),而timmer(home)的结果是返回值wapper home(
'dragon') #wrapper('dragon') auth('egon','123') #wrapper('egon','123') tell()
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)  #my_max(1,2)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper


@timmer#一看到装饰器就要注意,下面的函数就不要看了,就变成my_max=timmer(my_max)=wrapper,所 以my_max要返回值,给wrapper也一样的加上就可以
def my_max(x,y):
    print('my_max function')
    res=x if x > y else y
    return res
#带返回值的装饰器的写法注意了
res=my_max(1,2) #res=wrapper(1,2)
print('=====>',res)

 #####################################################################################################################

 有参装饰器

 对如下代码进行的解释,对装饰器进行传入参数,其实就是在原来装饰器的基础上,进行闭包的处理,(外面再加个函数,并返回auth),这样,你传进去的

变量 auth_type就可以在auth这个函数里用了,就可以加判断了

def auth2(auth_type):
    def auth(func):
        # print(auth_type)
        def wrapper(*args,**kwargs):
            if auth_type == 'file':
                name=input('username: ')
                password=input('password: ')
                if name == 'zhejiangF4' and password == 'sb945':
                    print('auth successfull')
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('auth error')
            elif auth_type == 'sql':
                print('还他妈不会玩')
        return wrapper
    return auth

@auth2(auth_type='sql') #@auth  #index=auth(index)
def index():
    print('welcome to inex page')

# @auth
# def home():
#     print('welcome to home page')
index()

有参函数执行过程

def auth2(auth_type): #1 #3
    def auth(func): #4 #6
        def wrapper(*args,**kwargs): #7 #10
            if auth_type == 'file': #11
                name=input('username: ')
                password=input('password: ')
                if name == 'zhejiangF4' and password == 'sb945':
                    print('auth successfull')
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('auth error')
            elif auth_type == 'sql': #12
                print('还他妈不会玩') #13
        return wrapper #8
    return auth #5

@auth2(auth_type='sql') #2     index=auth(auth_type='sql')
def index():
    print('welcome to inex page')

# @auth
# def home():
#     print('welcome to home page')
index() #9
# @aaa
# def func():
#     pass
#
#
# func=aaa(func)


#说明,同时加上多个装饰器的,从函数头上开始,由下往上,一个个的加
# @ccc
# @bbb
# @aaa
# def func():
#     pass
#
# func=ccc(bbb(aaa(func)))


#
# @ccc('c')
# @bbb('b')
# @aaa('a')
# def func():
#     pass
#
# func=ccc('c')(bbb('b')(aaa('a')(func)))
# current_login={'name':None,'login':False}
#
# with open('user.db','w') as f:
#     f.write(str(current_login))
#

with open('user.db','r') as f:
    x=f.read()
    print(x,type(x))

print(eval(x)['name'])

#eval函数说明
evel会把字符串里面的语句,拿来重新执行一下
比如x="{"name":"wan"}"
eval(x)
= {"name":"wan"}
 
原文地址:https://www.cnblogs.com/wanchenxi/p/7384378.html