2011-10-06 101 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__))。