gpt4 book ai didi

python - 如何从 "fluid"装饰函数中检索参数

转载 作者:行者123 更新时间:2023-11-28 22:38:32 26 4
gpt4 key购买 nike

假设我有这个装饰器:

def decorator(f):
def f_wrap(*args):
for item in args:
print(args)
return f(*args)
return f_wrap

当用作@ 语法的“永久”装饰器时,args 检索包装函数的参数。例如,当与下面的类一起使用时,我收到 MyObject 的实例。

Class MyObject(object):
def __init__(self):
pass

@decorator
def function(self):
return

如何使用“流体”装饰器实现相同的结果。或者不是永久绑定(bind)到它正在装饰的函数的装饰器?例如:

def decorator(f):
def f_wrap(*args):
if (not args):
print("Nothing in args")
return f(*args)
return f_wrap

class MyClass(object):
def __init__(self):
pass

def function(self):
return

if __name__ == "__main__":
myobj = MyClass()
myobj.function = decorator(myobj.function)
myobj.function()

在这种情况下,args 元组总是返回空(我总是得到“Nothing in args”),即使我预计它会返回实例变量 myobj .

编辑:

以防@AChampion不清楚的帖子解决方案是简单地将流体装饰方法称为“未绑定(bind)”方法。例如,

from types import MethodType
def decorator(f):
def f_wrap(*args):
# I replaced this with an iteration through
# args. It's a bit more demonstrative.
for item in args:
print(item)
return f(*args)
return f_wrap

class MyClass(object):
def __init__(self):
pass

def function(self):
return

if __name__ == "__main__":
myobj = MyClass()
myobj.function = MethodType(decorator(MyClass.function), myobj)
myobj.function()

最佳答案

差异的原因是你包装了不同的东西,未绑定(bind)方法与绑定(bind)方法:

class MyObject(object):
@decorator
def function(self):
pass

相当于:

import types
class MyClass(object):
def function(self):
pass

m = MyClass(object)
m.function = types.MethodType(decorator(MyClass.function), m)

不是:

m.function = decorator(m.function)

第一个是未绑定(bind)方法,第二个是绑定(bind)方法。

关于python - 如何从 "fluid"装饰函数中检索参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35526372/

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