2010-09-19 61 views
2

我認爲最好用一個例子來解釋。假設我有一種方法計算兩個向量之間的距離並打印它。我也想要這種方法來打印使用的距離度量。距離度量由調用者以可調用對象的形式給予函數。如果可調用對象是某個類的實例,我可以提供__str__方法來使其打印出距離度量的名稱。但可調用函數也可以是一個函數,在這種情況下,我還沒有找到方法來改變__str__。有些代碼:如何統一獲取類和函數的字符串表示形式?

def distance(v1, v2, d): 
    print d 
    dist = d(v1, v2) 
    print dist 
    return dist 

如果d是一個函數,print d將打印出類似<function someFunc at 0x1b68830>。我該如何改變這一點?只要打印出該函數的名字就沒有問題,因爲我通常給它們提供可讀的名字。

回答

1

得到一個函數的名字,see this question。 獲得班級名稱,see this question。 把它們放在一起:

def distance(v1, v2, d): 
    if hasattr(d, '__name__'): 
     print d.__name__ 
    elif hasattr(d, '__class__'): 
     print d.__class__.__name__ 
    else: 
     print d # unsure about this case 
    dist = d(v1, v2) 
    print dist 
    return dist 
2

我不認爲功能可以分類,這是你需要做的,以改變功能的__str__方法。讓一個類像函數一樣行爲(使用__call__方法)要容易得多。

函數具有func_name屬性,該屬性返回該函數的名稱。

如果您選擇使用func_name屬性,那麼您的可調用對象也需要func_name屬性。

由於您已經定義的類的__str__方法,你可以做func_name屬性返回str(self)這樣的:

def dfunc(v1,v2): 
    return 1 

class FooDist(object): 
    def __call__(self,v1,v2): 
     return 1 
    @property 
    def func_name(self): 
     return str(self) 
    def __str__(self): 
     return 'My FooDist' 


def distance(v1, v2, d): 
    print d.func_name 
    dist = d(v1, v2) 
    print dist 
    return dist 

distance(1,2,dfunc) 
# dfunc 
distance(1,2,FooDist()) 
# My FooDist 
1

你可以做

import types 
if isinstance(d, types.FunctionType): 
    print "<function %s>" % d.__name__ 
0

可以均勻地給這兩個類並具有您自己的屬性:

class MyDistanceMeasure: 
    name = "mine" 
    #... 

def another_distance_measure(x,y): 
    #... 

another_distance_measure.name = "another" 

然後:

def distance(v1, v2, d): 
    print d.name 
    # or.. 
    print getattr(d, 'name', "unknown") 

    dist = d(v1, v2) 
    print dist 
    return dist 
相關問題