gpt4 book ai didi

Python:用同一个装饰器装饰__call__和普通函数?

转载 作者:行者123 更新时间:2023-11-28 17:51:07 25 4
gpt4 key购买 nike

是否可以在 Python 2.6-2.7 中使用相同的装饰器来完成以下任务:

class ComplextCallableObject(object):
@wrap_me
def __call__(self, a1, a2):
pass

@wrap_me
def simple_function(a1, a2):
pass

ComplextCallableObject.__call__simple_function 都有相同的参数,但是 __call__ 也有第一个 self精氨酸。在 wrap_me 装饰器中,我需要访问被包装参数的函数。

最佳答案

不幸的是,在定义时(在本例中为类 block ),除了命名约定外,代码无法说明函数将如何使用。稍微修改您的示例:

class ComplextCallableObject(object):
@wrap_me
def __call__(self, a1, a2):
pass #...

@wrap_me
def simple_function(tgt, a1, a2):
pass

ComplextCallableObject.anInstanceMethod = simple_function
ComplextCallableObject.anClassMethod = classmethod(simple_function)
ComplextCallableObject.aStaticMethod = staticmethod(simple_function)

在这种情况下,simple_function 正在实现一个带有目标和两个参数的函数,一个带有两个参数的实例方法,一个带有两个参数的类方法,以及一个带有一个目标和两个参数的静态方法.但这些用途在定义函数之前不受约束。 staticmethodclassmethod 都返回不同的对象类型,因此您可以根据需要区分它们。

如果您确实想使用约定,您可以检查函数的第一个参数名称以查看它是否是 self:

def wrap_me(fn):
names = fn.func_code.co_varnames
if names and names[0]=='self':
print 'looks like an instance method'
else: print 'looks like a function'
return fn

关于Python:用同一个装饰器装饰__call__和普通函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9667855/

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