装饰器

本片笔记学习自:Improve Your Python: Decorators Explained

  • 首先需要知道的两个点:
    1.函数可以作为参数
    2.函数可以返回函数(生产函数)

  • 前进

Can we create a function that takes a function as a parameter and returns a function as the result. Would that be useful?

这样我们就可以接收一个函数,然后将其封装好后送出另外一个函数出去。

  • 例子
def currency(f):
    def wrapper(*args, **kwargs):
        return '$' + str(f(*args, **kwargs))

    return wrapper

在字符串之前加上’$‘。

    @currency
    def price_with_tax(self, tax_rate_percentage):
        """Return the price with *tax_rate_percentage* applied.
        *tax_rate_percentage* is the tax rate expressed as a float, like "7.0"
        for a 7% tax rate."""
        return price * (1 + (tax_rate_percentage * .01))

加上语法糖,表示price_with_tax已经被装饰,装饰的方式在currency中定义。

  • 一点点的“副作用”
    我们在装饰的同时也将函数变成了price_with_tax,.name 和.doc都会是currency的,我们需要对装饰器进行一些修改:
from functools import wraps

def currency(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        return '$' + str(f(*args, **kwargs))

    return wrapper
  • 威力
    装饰器的作用,一言以蔽之:

This notion of wrapping a function with additional functionality without changing the wrapped function is extremely powerful and useful.

Flask框架利用装饰器来给不同的路径添加不同的功能

@app.route('/')
def hello_world():
    return 'Hello World!'

装饰器可以添加参数的,下一次讲类装饰器再讲。

看完下面你就知道装饰器的形式了:

装饰器_第1张图片

用处:

装饰器_第2张图片
装饰器_第3张图片

你可能感兴趣的:(装饰器)