在Python 2.7中,如何覆盖单个函数的字符串表示?

And*_*lov 3 python python-2.7

如何在Python中覆盖单个函数的字符串表示形式?

我尝试过的:

>>> def f(): pass
... 
>>> f
<function f at 0x7f7459227758>
>>> f.__str__ = lambda self: 'qwerty'
>>> f
<function f at 0x7f7459227758>
>>> f.__repr__ = lambda self: 'asdfgh'
>>> f 
<function f at 0x7f7459227758>
>>> f.__str__(f)
'qwerty'
>>> f.__repr__(f)
'asdfgh'
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过创建一个类__call__(使其看起来像一个函数)和__str__(以自定义字符串表示)来获得预期的行为.不过,我很好奇我是否可以获得与常规功能相似的东西.

Mar*_*ers 6

你不能.__str__并且__repr__是特殊方法,因此总是在类型而不是实例上查找.你必须在type(f).__repr__这里覆盖,但那将适用于所有功能.

那么你唯一的现实选择就是使用一个带有__call__方法的包装器对象:

def FunctionWrapper(object):
    def __init__(self, callable):
        self._callable = callable
    def __call__(self, *args, **kwargs):
        return self._callable(*args, **kwargs)
    def __repr__(self):
        return '<custom representation for {}>'.format(self._callable.__name__)
Run Code Online (Sandbox Code Playgroud)