gpt4 book ai didi

Python 在类定义之外覆盖 __str__

转载 作者:太空宇宙 更新时间:2023-11-04 07:52:49 32 4
gpt4 key购买 nike

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

关于Python 在类定义之外覆盖 __str__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52681456/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com