我正在编写装饰器,我需要做的一部分是辨别函数是函数还是方法。有没有办法可以找到给定方法属于哪个类?
e.g。如果我要运行此代码,我可以在getOwner
中编写什么来使exampleFunc
打印出类似<class '__main__'.Example>
的内容?
class Example:
def method(self):
print("I'm a method")
def exampleFunc(func):
owner = getOwner(func)
print(owner)
test = Example()
exampleFunc(test.method)
答案 0 :(得分:2)
如果您需要做的就是弄清楚函数的行为是方法还是函数,这是types
模块的一个目的。
import types
def is_method(f):
return type(f) == types.MethodType
如果类函数对象是一个方法,您可以按如下方式找到它的父类。
更新修补了Python3的兼容性。
def method_parent(f):
return f.__self__
答案 1 :(得分:1)
如果您对范围中定义的类有参考,则需要检查每个类:
def exampleFunc(f):
class_list = [...]
return any(f in vars(c).values() for c in class_List)
如果函数True
是实例方法,则返回f
。但是,如果您希望返回实际的类名:
def exampleFunc(f):
class_list = [...]
for c in class_list:
if f in vars(c).values():
return c.__name__
return 'global function' if 'lambda' not in f.__name__ else 'lambda'
请注意,这不适用于__dunder__
方法以及您的类继承的方法。例如,
class A:
def f1(self): pass
class B(A):
def f2(self): pass
print(vars(B))
mappingproxy({'__doc__': None,
'__module__': '__main__',
'f2': <function __main__.B.f2>})
请注意,f1
不属于B
mappingproxy
的一部分。