Python | 属性包装器

1. 普通方法

1.1. 装饰器无参数

def warp(callback):
    def f(*args, **kwargs):
        print('调用之前')
        callback(*args, **kwargs)
        print('调用之后')

    return f


@warp
def hello(name: str = '未设置'):
    print(f'hello {name}')


if __name__ == '__main__':
    hello('yimt')

Output

调用之前
hello yimt
调用之后

1.2. 装饰器有参数

def warp(name: str):
    def f1(callback):
        def f2(*args, **kwargs):
            kwargs['name'] = name
            print('调用之前')
            callback(*args, **kwargs)
            print('调用之后')

        return f2

    return f1


@warp('yimt')
def hello(name: str = '未设置'):
    print(f'hello {name}')


if __name__ == '__main__':
    hello()

Output

调用之前
hello yimt
调用之后

2. 类方法

2.1. 装饰器不带参数

def wrap(callback):
    def f(*args, **kwargs):
        print('调用之前')
        r = callback(*args, **kwargs)
        print('调用之后')
        return r

    return f


class A:
    @wrap
    def hello(self, name: str = '未设置'):
        print(f'hello {name}')


a = A()
a.hello('yimt')

Output

调用之前
hello yimt
调用之后

2.2. 装饰器带参数

def wrap(name: str):
    def f1(callback):
        def f2(*args, **kwargs):
            kwargs['name'] = name
            print('调用之前')
            r = callback(*args, **kwargs)
            print('调用之后')
            return r

        return f2

    return f1


class A:
    @wrap('yimt')
    def hello(self, name: str = '未设置'):
        print(f'hello {name}')


a = A()
a.hello()

Output

调用之前
hello yimt
调用之后

3. 多装饰器

def warp_a(callback):
    def f(*args, **kwargs):
        print('a调用之前')
        callback(*args, **kwargs)
        print('a调用之后')

    return f


def warp_b(callback):
    def f(*args, **kwargs):
        print('b调用之前')
        callback(*args, **kwargs)
        print('b调用之后')

    return f


@warp_a
@warp_b
def hello(name: str = '未设置'):
    print(f'hello {name}')


if __name__ == '__main__':
    hello('yimt')

Output

a调用之前
b调用之前
hello yimt
b调用之后
a调用之后
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yimtcode

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

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

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

打赏作者

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

抵扣说明:

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

余额充值