python装饰器

在这里插入图片描述
函数基础:

#将函数赋值给变量
def hello():
    print('hello')

Hi = hello
Hi()

#将函数作为参数传递
def add(a,b):
    return a + b

def subtract(a,b):
    return a - b

def action(x,y,function):
    return function(x,y)

action(5,3,add)
action(5,3,subtract)


#函数嵌套
def greeting():
    def welcome():
        return 'Welcome'
    return welcome() #返回函数welcome的执行结果

greeting()


#函数跨域访问
def fun1():
    x = 10
    def fun2():
        nonlocal x #定义不是本地x,而是使用fun2外层fun1内的x
        return x + 10
    return fun2()

fun1()

装饰器的定义方式:
函数定义装饰器(函数定义装饰器既可以用在脚本里包含的普通函数上,也可以用在一个类包含的方法上)

#函数定义装饰器


def p_decorator(func):#定义一个装饰器函数,参数是需要需要装饰的函数
    def wapper(*args, **kwargs):#任何函数的任何类型的参数都可以通过*args, **kwargs来表示。因为,*args可以理解为所有元组传递进来的单个参数,就是一些没有名字按照位置传递的的数据,**kwargs可以理解为带有名字的数据
        return '<P>' + func(*args, **kwargs) + '</P>'#保留需要修饰的函数的原始功能,增加装饰效果
    return wapper#返回函数的对象而不是结果,意味着返回的东西并没有被执行

@p_decorator#使用定义好的装饰器对函数进行装饰
def get_text():#对不带参数的函数进行装饰
    return '欢迎学习'

@p_decorator
def get_upper_text(text):#对带参数的函数进行装饰
    return text.upper()

class Student:
    def __init__(self,name):
        self.name = name
    @p_decorator#对一个类中的函数进行装饰
    def get_upper_name(self):
        return self.name.upper()

if __name__ == '__main__':
    print(get_text())
    print(get_upper_text('hello'))
    s = Student('tom')
    print(s.get_upper_name())

程序运行结果如图,函数定义装饰器既可以用在脚本里包含的普通函数上,也可以用在一个类包含的方法上。
在这里插入图片描述
类定义装饰器(类定义的装饰器可以用在脚本里包含的普通函数上,当用在另外一个类包含的方法上时会因为两个类的self冲突而出现错误)

#类定义装饰器


class P:#通过创建类来创建装饰器
    def __init__(self,func):#构造函数
        self.func = func
    def __call__(self, *args, **kwargs):#调用函数
        return '<P>' + self.func(*args, **kwargs) + '</P>'#定义如何装饰传递进来的函数

@P#使用定义好的装饰器对函数进行装饰
def get_text():#对不带参数的函数进行装饰
    return '欢迎学习'

@P
def get_upper_text(text):#对带参数的函数进行装饰
    return text.upper()

class Student:
    def __init__(self,name):
        self.name = name
    #@p_decorator#对一个类中的函数进行装饰
    def get_upper_name(self):
        return self.name.upper()

if __name__ == '__main__':
    print(get_text)
    print(get_upper_text('hello'))
    s = Student('tom')
    print(s.get_upper_name())

程序(未对另一个类中的函数进行装饰)运行结果如图,类定义的装饰器可以用在脚本里包含的普通函数上。
在这里插入图片描述
程序(对另一个类中的函数进行装饰)运行结果如图,出现错误,当用在另外一个类包含的方法上时会因为两个类的self冲突而出现错误。
在这里插入图片描述
参数化装饰器,对装饰器外侧在进行一次封装来接受参数,不影响装饰器原本功能。

#参数化装饰器

def tags(tag):#参数化装饰器实现原理:对装饰器外侧在进行一次封装来接受参数
    def tag_decorator(func):#定义一个装饰器函数,参数是需要需要装饰的函数
        def wapper(*args, **kwargs):#任何函数的任何类型的参数都可以通过*args, **kwargs来表示。因为,*args可以理解为所有元组传递进来的单个参数,就是一些没有名字按照位置传递的的数据,**kwargs可以理解为带有名字的数据
            return f'<{tag}>{func(*args, **kwargs)}</{tag}>'#保留需要修饰的函数的原始功能,增加装饰效果
        return wapper#返回函数的对象而不是结果,意味着返回的东西并没有被执行
    return tag_decorator

@tags('p')#使用定义好的装饰器对函数进行装饰
def get_text():#对不带参数的函数进行装饰
    return '欢迎学习'

@tags('div')#可以通过改变参数,来改变装饰器装饰效果
def get_upper_text(text):#对带参数的函数进行装饰
    return text.upper()

class Student:
    def __init__(self,name):
        self.name = name
    @tags('div')#对一个类中的函数进行装饰
    @tags('p')#可以多次装饰,靠近函数的为装饰器为内侧装饰效果
    def get_upper_name(self):
        return self.name.upper()

if __name__ == '__main__':
    print(get_text())
    print(get_upper_text('hello'))
    s = Student('tom')
    print(s.get_upper_name())

程序运行结果如图所示,实现参数化装饰器功能。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值