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

use*_*728 6 oop types python-3.x

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

例如,如果我要运行这段代码,我可以写什么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)
Run Code Online (Sandbox Code Playgroud)

Han*_*ave 5

如果您需要做的就是弄清楚函数的行为是方法还是函数,这就是该types模块的目的之一。

import types

def is_method(f):
    return type(f) == types.MethodType
Run Code Online (Sandbox Code Playgroud)

如果类函数对象是一个方法,您可以如下找到它的父类。

更新修补了 Python3 兼容性。

def method_parent(f):
    return f.__self__
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 1

如果您引用了范围内定义的类,则需要检查每个类:

def exampleFunc(f):
    class_list = [...]
    return any(f in vars(c).values() for c in class_List)
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

请注意,这不适用于__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>})
Run Code Online (Sandbox Code Playgroud)

请注意,这f1不是Bs的一部分mappingproxy