在Python2.7中,如何覆盖单个函数的字符串表示?
如何在Python中重写单个函数的字符串表示 我所尝试的:在Python2.7中,如何覆盖单个函数的字符串表示?,python,python-2.7,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
>>> 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'
>>def():通过
...
>>>f
>>>f.。\uuuuu str\uuuuuu=lambda self:'qwerty'
>>>f
>>>f.。\uuuuu repr\uuuuu=lambda self:'asdfgh'
>>>f
>>>f.uuu str_uuf(f)
“qwerty”
>>>f.u_u报告(f)
“asdfgh”
我知道我可以通过使用
\uuuu call\uuuu
(使其看起来像一个函数)和\uu str\uuuu
(自定义字符串表示)创建一个类来获得预期的行为。尽管如此,我还是很好奇我是否能用常规函数得到类似的结果。你不能<代码>\uuuu str\uuuu和\uuuu repr\uuuu
是特殊方法,因此不是实例。您必须在此处重写类型(f)。\uu repr\uu
,但这将适用于所有函数
然后,您唯一现实的选择是将包装器对象与\u调用\u
方法一起使用:
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__)
def FunctionWrapper(对象):
def uuu init uuu(自,可调用):
self.\u callable=可调用
定义调用(self,*args,**kwargs):
返回自我。可调用(*args,**kwargs)
定义报告(自我):
返回“”。格式(自身可调用名称)
正如MartijnPieters所解释的那样,不上一节课是不行的。但您可以轻松编写一个装饰器,完全隐藏增加的复杂性:
from functools import update_wrapper
class _CustomReprFunc(object):
def __init__(self, fn, repr_):
self.fn = fn
self.repr = repr_
update_wrapper(self, fn)
def __repr__(self):
return self.repr
def __call__(self, *args, **kwargs):
return self.fn(*args, **kwargs)
def custom_repr(repr_):
def decorator(fn):
return _CustomReprFunc(fn, repr_)
return decorator
用法:
@custom_repr('foobar')
def foo():
"""foo function"""
return 'bar'
记住:dunder函数是在类而不是实例上查找的。