python 装饰器

 前提:
 

"""
1、是一个嵌套函数;
2、内部函数引用了外部函数的变量;
3、返回值是内部函数;
符合以上三个条件就是闭包。
闭包本身没有太大作用,主要是用在装饰器上。

"""

def outer(n):
    a = 10
    def inner():
        b = a + n
        print("内部函数:",b)
    return inner

r=outer(5)
print(r)   #运行结果:<function outer.<locals>.inner at 0x00000234F3C2D6A8>
r()        #运行结果:内部函数: 15

一、不带参数装饰器

#定义装饰器
def decorater(func):  #装饰器中要传人一个函数,就是被装饰的函数
    def wrapper():  #定义内部函数
        func()    #先调用一下传进来的函数本身
        print("铺地板")  #做其他执行操作
        print("刷墙面")
        print("买家具")
    return wrapper   #返回执行完毕的函数,要作为对象返回出去,不能加()

@decorater
def house():
    print("毛坯房....")

house()

运行结果:
毛坯房....
铺地板
刷墙面
买家具

二、带参数装饰器

#带参数装饰器

def decorater(func):
    def wrapper(*args,**kwargs):
        #传进来的args是一个元组,所以在下面的调用中需要对元组解包,所以在args前面加上星号来解决这个问题。
        func(*args,**kwargs)
        print("铺地板")
        print("刷墙面")
        print("买家具")
    return wrapper

@decorater
def house(address):
    print("房子的地址是:{}".format(address))

@decorater
def changfang(address,area):
    print("房子的地址是:{},面积是{}平米".format(address,area))

@decorater
def hotel(name,address,area=40):
    print("酒店的名字:{},酒店地址是:{},单间房子的面积是{}平米".format(name,address,area))

house("北京四合院")
print("--------------")
changfang("北京沙河",1000)
print("--------------")
hotel("东岸","北京",area=100)

运行结果:
房子的地址是:北京四合院
铺地板
刷墙面
买家具
--------------
房子的地址是:北京沙河,面积是1000平米
铺地板
刷墙面
买家具
--------------
酒店的名字:东岸,酒店地址是:北京,单间房子的面积是100平米
铺地板
刷墙面
买家具

三、带返回值的装饰器

def decorater(func):
    def wrapper(a,b):
        f=func(a,b)
        j=f+100
        return j    #原函数有返回值,装饰器内部函数也要有返回值
    return wrapper


@decorater
def add(a,b):
    c=a+b
    return c

d=add(1,3)
print(d)

运行结果:
104

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知远同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值