如何在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__(以自定义字符串表示)来获得预期的行为.不过,我很好奇我是否可以获得与常规功能相似的东西.
你不能.__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)
| 归档时间: |
|
| 查看次数: |
299 次 |
| 最近记录: |