2016-11-11 26 views
1

我有以下幾點:如何獲得類名稱的類之外,鑑於它的功能

def print_class_name(func): 
    def print_name(*args, **kw): 
    print(func.__name__)   # 'whatever_func' 
    print(func.__class__.__name__) # it doesn't work :(

class Foo(): 
    @print_class_name 
    def whatever_func(self): 
     pass 

我只能觸摸裝飾功能print_class_name,但不是階級Foo。我如何使用print_class_name裝飾者打印班級名稱('Foo')?

請注意,這是一個簡化。類和裝飾可能在不同的模塊中。

回答

2

如果該方法不是靜態的(它需要的類的實例),我想你可以從method_name.__self__.__class__

class FooClass(object): 

    def bar_method(self): 
     pass 

    def baz_static_method(): 
     pass 

foo_instance = FooClass() 
print(foo_instance.bar_method.__self__.__class__) 
print(FooClass.baz_static_method.im_class) 

獲取定義方法的類這將變得混亂多重繼承。希望能幫助到你。

+0

如果我使用'func .__ self______ class__',我收到一個異常:'{AttributeError}'函數'object has no attribute'__self __'' – mcamacho

+0

我將添加一個示例 –

+0

非常感謝您的回覆。可悲的是,我無法訪問實例,我必須堅持我發佈的代碼,我只能修改我的裝飾器函數。 – mcamacho