gpt4 book ai didi

python - 是否可以确定函数是哪个类的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:27:57 25 4
gpt4 key购买 nike

例如,如果我像这样装饰一个方法

def my_decorator(fn):

# Do something based on the class that fn is a method of

def decorated_fn(*args, **kwargs):
fn(*args, **kwargs)

return decorated_fn

class MyClass(object):

@my_decorator
def my_method(self, param):
print "foo"

是否可以在 my_decorator 中确定 fn 的来源?

最佳答案

简答:否。

更长的答案:您可以通过在堆栈跟踪中乱搞(参见 inspect 模块)来做到这一点,但这不是一个好主意。

完整答案:在函数被装饰时,它仍然是一个未绑定(bind)的函数。尝试以下操作:

def my_dec(fn):
print dir(fn) # Has "func_code" and "func_name"
return fn

class A(object):
@my_dec
def test(self):
pass

print dir(A.test) # Has "im_class" and "im_self"

您可以看到原始函数被传递给装饰器,而绑定(bind)函数在类声明后可用。

实现这一点的方法是将函数装饰器与 metaclass 结合使用。或 class decorator .在任何一种情况下,函数装饰器都可以在函数上设置一个标志,元类或类装饰器可以查找它并做适当的事情。

关于python - 是否可以确定函数是哪个类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3973496/

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