首页 > 解决方案 > 为什么调用python装饰函数?

问题描述

用python 3.8练习

import functools


def print_name2(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        print('2: {} has been revoked'.format(f.__name__))
        return f(*args, **kwargs)
    return wrapper


def print_name3(f):
    print('3: {} has been revoked'.format(f.__name__))
    return f


@print_name3
def my_str(i):
    return str(i)


@print_name2
def my_str2(i):
    return str(i)

一旦我运行代码,我得到

3: my_str has been revoked

这让我很困惑,因为我还没有进行任何函数调用

标签: pythonpython-3.xpython-decorators

解决方案


在 python 中,装饰器在装饰点执行。您的代码等效于:

import functools

def print_name2(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        print('2: {} has been revoked'.format(f.__name__))
        return f(*args, **kwargs)
    return wrapper


def print_name3(f):
    print('3: {} has been revoked'.format(f.__name__))
    return f

def my_str(i):
        return str(i)
my_str = print_name3(my_str)

def my_str2(i):
    return str(i)
my_str2 = print_name2(my_str2)

我们基本上将 my_str 和 my_str2 替换为装饰器函数返回的任何内容。现在, print_name2 返回一个打印某些内容的新函数,因此没有打印任何内容。同时, print_name3 会立即打印一些内容,因为您没有将其包装在新函数中。


推荐阅读