gpt4 book ai didi

python - 这个 python 装饰器是如何工作的?

转载 作者:行者123 更新时间:2023-11-28 20:10:58 24 4
gpt4 key购买 nike

编辑/澄清以使我的问题针对我的查询:*我可以看到装饰器静态日志函数是如何调用的,但是我没有看到_是如何调用的,它的结果是如何记录的。我看到了输入/输入的东西是如何工作的*

class logger:
@staticmethod
def log(func):
def ___(*args, **kwargs):
try:
print "Entering: [%s] with parameters %s" % (func.__name__, args)
try:
return func(*args, **kwargs)
except Exception, e:
print 'Exception in %s : %s' % (func.__name__, e)
finally:
print "Exiting: [%s]" % func.__name__
return ___


class x:
@logger.log
def first_x_method(self):
print 'doing first_x_method stuff...'

x().first_x_method()

给出这个输出:

Entering: [first_x_method] with parameters (<__main__.x instance at 0x0000000001F45648>,)
doing first_x_method stuff...
Exiting: [first_x_method]

可以看出logger是一个类,有一个静态方法用来修饰(@logger.log)first_x_method。

但是我不明白为什么调用 ___ 子方法(它可以是任何名称)。

最佳答案

关于装饰器的基本事实是

@decorator
def func(): ...

完全等同于

def func(): ...
func=decorator(func)

所以,

@logger.log
def first_x_method(self): ...

相同
def first_x_method(self): ...
first_x_method=logger.log(first_x_method)

因此 logger.log 静态方法被调用并带有参数 func = first_x_method

在对 logger.log(first_x_method) 的调用中,定义并返回了子方法 __

first_x_method=logger.log(first_x_method) 因此设置 first_x_method 来引用子方法 __

first_x_method() 中的括号告诉 Python 调用方法 first_x_method

因此 x().first_x_method() 首先实例化类 x 的一个实例,然后调用方法 first_x_method(将 x() 作为第一个参数提供).

因为 first_x_method 引用了 __,所以调用的是 __

关于python - 这个 python 装饰器是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5481739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com