python装饰器初步

版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/details/86599792

装饰器

把一个函数当作参数,返回一个替代版的函数
本质就是返回函数的函数

“在不改变原有函数的基础上,给函数增加功能”

def fc1():
    print("1")
def ou(suiyi):
    def inn():
        fc1()
        print("2")
    return inn
cese=ou(fc1)
cese()


装饰器
def decorator(asasaaa):
    def wrapper(*args):
        asasaaa(*args) #a1
        print("1")
    return wrapper

@decorator  #a2
def f1(funcname):
    print(funcname)
@decorator  #a3
def f2(*args):
    print(args)
f1("a")
f2("a","b","c")
#a1 结合#a2a3表示,只要在前面写了@decorator  
会自动匹配参数值对应的函数并且也会执行print(1)你原本函数的内容
#a1可以自定义名字,因为#a2 #a3 会自动匹配
其中@decorator 和def decorator 名称要一致
便于理解的形式如下
def decora(f1):
    def a(a,b):
        f1(a,b)
        print("1")
        f1(a,b)
    return a
@decora
def f1(a,b):
    print(a+b)
f1(3,4)
也可以


装饰器中的返回值:如果函数有返回值,那么装饰器中也必须有返回值
def decora(f1):
    def a(*args,**kwargs):
        # f1(a,b)
        print("1")
        f1(*args,**kwargs)
    return a
@decora
def f2(*args):
    print(args)
f2(1,2)

import string
import random
import time
import functools
num=[(random.choice(string.ascii_letters+string.digits)) for i in range(100)]

def zs(fc):
    @functools.wraps(fc)  #保留函数名词和文档信息
    def wrap(*args,**kwargs):
        start_time=time.time()
        res=fc(*args,**kwargs)
        end_time=time.time()
        print("时间为%.7fs"%(end_time-start_time))
        return res
    return wrap

@zs
def fc1():
    '''s+i'''
    s=''
    for i in num:
       s+=i+""
@zs
def fc2():
    '''join'''
    # "".join(num)
    return "".join(num)
fc1()
print(fc1.__doc__)
fc2()
print(fc2.__doc__)
print(list(fc2()))

# _*_coding:utf-8_*_
'''
Name:20.5.py
Date:1/12/19
Author:hzp
Connect:[email protected]
'''
import string
import random
import time
import functools
num=[(random.choice(string.ascii_letters+string.digits)) for i in range(100)]
print(num)
def zs(fc):
    @functools.wraps(fc)  #保留函数文档信息
    def wrap(*args,**kwargs):
        start_time=time.time()
        res=fc(*args,**kwargs)
        end_time=time.time()
        print("时间为%.7fs"%(end_time-start_time))
        return res
    return wrap

扫描二维码关注公众号,回复: 5039887 查看本文章

@zs
def fc1():
    '''s+i'''
    s=''
    for i in num:
       s+=i+""
    print(s)
@zs
def fc2():
    '''join'''
    print("".join(num))
fc1()
print(fc1.__doc__)
fc2()
print(fc2.__doc__)

猜你喜欢

转载自blog.csdn.net/m493096871/article/details/86599792