Skip to main content
 首页 » 编程设计

Python 在类定义之外覆盖 __str__

2025年05月04日14落叶

假设我有一个导入的模块,它工作正常但没有提供好的 __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__ 函数,而不是猴子补丁 稍后再处理。