python: @ 装饰器的用法

装饰器基础

@意味着@下面定义的函数/类/方法是@后面函数的输入。例如以下两种方式是相等的:

    @func

    def x(a, b):

        return f2
    def func(f):

        return f1(f)

   

    def x(a, b):

        return f2(a, b)

   

    x = func(x)

@property

允许将类方法以类属性的形式调用,每次调用会单独进行一次计算:

    class A(object):

        def __init__(self,x):

            self.x = x

        @property

        def add1(self):

            return self.x + 1

   

    a = A(1)

    a.add1

@classmethod

可选构造函数或再次初始化

    class A:

        def __init__(self, x):

            self.x = x

        @classmethod

        def from_subtract(cls, x1):

            return cls(x1 - 1)

   

    a = A.from_subtract(2)

在 init 之前构造类,参数 `cls` 类似 `self` ,但泛指整个该类,而不是一个实例对象。

@staticmethod

不需要 `self` 或 `cls`.

装饰器详解

@表示的装饰器具备如下特点:

  • @后的函数后加括号时,等效于@该函数的返回值后不加括号
  • 在解释的时候立即执行,不会等到显式调用
  • 将被装饰函数替换为以该函数为输入的装饰函数的返回值

例子:

def decorator_factory(a):

    print(f'decorator_factory: {a}')

    def decorator(fn):

        print('decorator')

        def wrapper():

            print("Before calling function")

            fn()

            print("After calling function")

        return wrapper

    return decorator



@decorator_factory(0314)

def my_function():

    print("The function is called")

在这个例子中,@decorator_factory()等效于执行一遍decorator_factory后被替换为@decorator; 然后启动装饰执行一遍decorator(my_function)后将my_function替换为decorator的返回值,即wrapper,此时每次调用my_function,等同于调用wrapper。其输出为:

decorator_factory: 0314

decorator

如果执行

my_function()

则输出

Before calling function

The function is called

After calling function

如果没有@decorator_factory(),替换为@decorator可起到同样的效果,但此时decorator将没有自由参数a

如果没有wrappermy_function将被替换为None,无法被再次调用,只在解释装饰器时执行一遍decorator(my_function)

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值