Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python2.7中,如何覆盖单个函数的字符串表示?_Python_Python 2.7 - Fatal编程技术网

在Python2.7中,如何覆盖单个函数的字符串表示?

在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

如何在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'
>>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函数是在类而不是实例上查找的。