Python-装饰器

装饰器:

  1. 把一个函数当作参数传递给另一个函数,返回一个替代版的函数
  2. 本质上就是一个返回函数的函数
  3. 在不改变原函数的基础上 给函数增加功能

基础格式

def outer(f):						#装饰器outer(),外壳
	def inner():					#实际修改内容的函数inner
	    print('***********')
	    f()
	    print('!!!!!!!!!')
	return inner					#返回inner函数,若没有外壳outer无法返回inner

@outer 								#语法糖,使用在装饰器之后
def func():							#被装饰函数func
    print('lalalala')
func()

显示结果:
***********							#装饰器添加内容
lalalala							#原函数内容
!!!!!!!!!							#装饰器添加内容

被装饰函数带参数及返回值

import time
import functools
import random
import string


def add_log(f):								#装饰器
    @functools.wraps(f)						#禁止显示装饰器的函数说名
    def _add_log(*args,**kwargs):			#被装饰函数参数
        """									#函数说明
        装饰器:字符串时间\函数名\运行时间\函数返回结果		
        """
        s_time=time.time()
        res=f(*args,**kwargs)				#
        e_time=time.time()
        print(time.ctime())
        print("函数名:"+f.__name__)
        print("运行时间:%.6f" %(e_time - s_time))
        return res							#被装饰函数返回值
    return _add_log					

@add_log
def str_add(li):							#被装饰函数,参数
    """										#函数说明内容
    字符列表 -----> 字符串,6位随机字符

    输入:6个随机字符
    输出:一个字符串
    """
    return ''.join(li)						#被装饰函数,返回值

l = [random.choice(string.ascii_letters) for i in range(6)]

print("运行结果:"+str_add(l))
print(str_add.__doc__)						#函数说明显示

显示结果:
Tue Dec 10 00:06:00 2019
函数名:str_add
运行时间:0.000002
运行结果:GzfCmq

    字符列表 -----> 字符串,6位随机字符

    输入:6个随机字符
    输出:一个字符串

多个装饰器

def decorator_a(fun):

    def inner_a(*args,**kwargs):
        print('Get in inner_a')
        fun(*args,**kwargs)
    return inner_a

def decorator_b(fun):

    def inner_b(*args,**kwargs):
        print('Get in inner_b')
        fun(*args,**kwargs)
    return inner_b

# 多个装饰器装饰函数 从上到下去执行的
@decorator_a
@decorator_b
def f(x):
    print('Gat in f')
f(1)

显示结果:
Get in inner_a
Get in inner_b
Gat in f

装饰器参数

import functools

def ints_(*kind):       #装饰器参数
    def ints(f):
        @functools.wraps(f)
        def _ints(*args,**kwargs):
            for i in args:
                if not isinstance(i, kind):			#传入装饰器参数做对比
                    print(f"TypeError,{i} is not {kind}")
                    break
            else:
                res = f(*args,**kwargs)
                return res

        return _ints
    return ints
@ints_(int)                 #装饰器参数
def add(a, b):
    return a + b
@ints_(float)				#装饰器参数可修改
def mymax(a,b,c,d):
    return max(a,b,c,d)

print(f"add(1,2.0):{add(1,2.0)}")
print(f"add(2,3){add(2,3)}")
print(f"mymax(1,2,3,5){mymax(1,2,3,5)}")
print(f"mymax(1.0,2.0,3.0,5.0){mymax(1.0,2.0,3.0,5.0)}")

显示结果:
TypeError,2.0 is not (<class 'int'>,)
add(1,2.0):None
add(2,3)5
TypeError,1 is not (<class 'float'>,)
mymax(1,2,3,5)None
mymax(1.0,2.0,3.0,5.0)5.0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值