代码之家  ›  专栏  ›  技术社区  ›  Björn Pollex

如何统一得到类和函数的字符串表示形式?

  •  2
  • Björn Pollex  · 技术社区  · 14 年前

    我想最好用一个例子来解释。假设我有一个方法来计算两个向量之间的距离并打印它。我还想用这个方法来打印所用的距离测量值。距离度量由调用方以可调用对象的形式提供给函数。如果可调用文件是某个类的实例,我可以提供 __str__ 方法使其打印出距离测量的名称。但是可调用也可以是一个函数,我还没有找到一种方法来改变 _战略__ 在这种情况下。一些代码:

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

    如果 d 是一个函数, print d 会打印出 <function someFunc at 0x1b68830> . 我怎么能换这个?只要打印出函数的名称就可以了,因为我通常会给它们提供可读的名称。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    8 年前

    要获取函数名, 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
  •  2
  •   unutbu    14 年前

    我不认为函数可以被子类化,这是为了改变函数的 __str__ 方法。使类的行为类似于函数(使用 __call__ 方法)。

    函数具有 func_name 属性,返回函数名。

    如果你选择使用 func_名称 属性,则可调用对象将需要 func_名称 属性也是。

    因为你已经定义了类的 _战略__ 方法,你可以 func_名称 要返回的属性 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
    
        3
  •  1
  •   Jochen Ritzel    14 年前

    你可以的

    import types
    if isinstance(d, types.FunctionType):
        print "<function %s>" % d.__name__
    
        4
  •  0
  •   Ned Batchelder    14 年前

    您可以统一地为类和函数赋予自己的属性:

    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