2010-09-19 60 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 
相关问题