假设我有一个导入的模块,它工作正常但没有提供好的 __str__ 方法,我想添加一个。
在一些混合语言中:
from foo import Foo
Foo.prototype._str__ = function myNIcePrintFunction(){
}
请问我如何在 Python 中执行此操作?
请您参考如下方法:
您可以先定义一个函数,然后对其进行猴子修补。
喜欢:
def foostr(self):
return 'A foo str'
Foo.__str__ = foostr
或者使用lambda 表达式:
Foo.__str__ = lambda self: 'Another foo str'
然而,这个方法有一个不同的 Foo.__str__.__name__ 等等,但有一个小区别。但是 str(..) 内置函数将按预期工作。正如 @chepner 所说,我们可以使用 functools 中的 wrap 函数来保留大多数元数据:
from functools import wraps
def foostr(self):
return 'A foo str'
Foo.__str__ = wraps(Foo.__str__)(foostr)
但是 Foo.__str__.__qualname__ 将例如导致 'superfoo.__str__'(superfoo 是 < em>实现 __str__ 的 Foo 的方法解析顺序 (MRO)。
例如:
>>> class Foo:
... pass
...
>>> str(Foo())
'<__main__.Foo object at 0x7f807046e668>'
>>> Foo.__str__ = lambda self: 'another Foo str'
>>> str(Foo())
'another Foo str'
如果您有权访问 Foo 类的实现,那么最好只在类中定义一个 __str__ 函数,而不是猴子补丁 稍后再处理。
