2011-10-06 48 views
5

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

我的装饰:

def specialTest(fn): 
    filename = fn.__name__ 
    directory = fn.__module__ 
    subdirectory = fn.__class__.__name__ #WHERE DO I GET THIS 
+0

fn.im_class .__ name__ – janoliver

+0

在装饰器中给出一个特殊的参数,说'is_member_func',如果它是真的,那么得到第一个参数是self。 –

回答

8

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

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

注意,这将从装饰不的工作,因为一个功能后才变成一个实例方法类的定义(即,如果@specialTest被用来装饰bar,也不会工作;如果甚至有可能,那么在检查调用堆栈或类似的事情时就必须这样做)。

+0

这就是我所害怕的。谢谢。 –

+0

由于某种原因,我没有注册,直到我回到代码中。这是可能的,我只需将我的代码与包装函数中的FN进行交互,其中FN是一个实例。 –

+0

这是不可能在定义时间,但是你可以列出创建类后的装饰函数:为了达到这个目的,装饰者必须在类上放置一些标记属性 – kolypto

6

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