从装饰器获取Python函数的拥有类

Cor*_*gan 7 python class function decorator inspect

我在PY有一个装饰师.它是一种方法,并将该函数作为参数.我想基于传递的函数创建一个基于目录的结构.我正在使用父目录的模块名称,但是想使用类名作为子目录.我无法弄清楚如何获取拥有fn对象的类的名称.

我的装饰者:

def specialTest(fn):
    filename = fn.__name__
    directory = fn.__module__
    subdirectory = fn.__class__.__name__ #WHERE DO I GET THIS
Run Code Online (Sandbox Code Playgroud)

Dav*_*ver 8

如果fninstancemethod,那么你可以使用fn.im_class.

>>> class Foo(object):
...     def bar(self):
...         pass
...
>>> Foo.bar.im_class
__main__.Foo

请注意,这不适用于装饰器,因为定义类之后,函数只会被转换为实例方法(即,如果@specialTest用于装饰bar,它将无法工作;如果它甚至可能,那么在此时执行将必须通过检查调用堆栈或同样不快乐的事情来完成.


Cat*_*lus 6

在Python 2中,您可以im_class在方法对象上使用属性.在Python 3中,它将是__self__.__class__(或type(method.__self__)).