在Python中查找方法的所有者类

时间:2018-05-27 23:04:43

标签: python-3.x oop types

我正在编写装饰器,我需要做的一部分是辨别函数是函数还是方法。有没有办法可以找到给定方法属于哪个类?

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)

2 个答案:

答案 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的一部分。