Python在类定义之外覆盖__str__

Rob*_*bin 1 python class

假设我有一个我导入的模块工作正常,但没有提供一个好的__str__方法,我想添加一个.

在一些混合语言中:

from foo import Foo

Foo.prototype._str__ = function myNIcePrintFunction(){

}
Run Code Online (Sandbox Code Playgroud)

请问如何在Python中执行此操作?

Wil*_*sem 5

您可以先定义一个函数,然后对它进行猴子修补.

喜欢:

def foostr(self):
    return 'A foo str'

Foo.__str__ = foostr
Run Code Online (Sandbox Code Playgroud)

或者使用lambda表达式:

Foo.__str__ = lambda self: 'Another foo str'
Run Code Online (Sandbox Code Playgroud)

然而,这个方法会有不同的Foo.__str__.__name__等等,但是str(..)内置函数会按预期工作.正如@chepner所说,我们可以使用wrap函数functools来保存大多数元数据:

from functools import wraps

def foostr(self):
    return 'A foo str'

Foo.__str__ = wraps(Foo.__str__)(foostr)
Run Code Online (Sandbox Code Playgroud)

但随后Foo.__str__.__qualname__将针对示例结果'superfoo.__str__'(与superfoo在第一类方法解析顺序(MRO)Foo该实施__str__).

例如:

>>> class Foo:
...   pass
... 
>>> str(Foo())
'<__main__.Foo object at 0x7f807046e668>'
>>> Foo.__str__ = lambda self: 'another Foo str'
>>> str(Foo())
'another Foo str'
Run Code Online (Sandbox Code Playgroud)

如果您可以访问Foo类的实现,那么最好只__str__在类中定义一个函数,而不是在稍后的过程中对它进行修补.

  • 您可以使用`functools.wrap`来保存(大部分)元数据:`Foo .__ str__ = functools.wraps(Foo .__ str __)(foostr)`. (2认同)