假设我有一个我导入的模块工作正常,但没有提供一个好的__str__方法,我想添加一个.
在一些混合语言中:
from foo import Foo
Foo.prototype._str__ = function myNIcePrintFunction(){
}
Run Code Online (Sandbox Code Playgroud)
请问如何在Python中执行此操作?
您可以先定义一个函数,然后对它进行猴子修补.
喜欢:
def foostr(self):
return 'A foo str'
Foo.__str__ = foostrRun 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__在类中定义一个函数,而不是在稍后的过程中对它进行修补.