gpt4 book ai didi

python - 如何为已经实例化的类 python 覆盖 __repr__ 方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:36 25 4
gpt4 key购买 nike

我正在使用一个第 3 方库,该库的某个类的 repr 很差,我想在创建该类的实例后覆盖它。

我看到了如何在现有对象中创建绑定(bind)方法。

class toy():
pass

inst= toy()

class inhtoy():
def __new__(cls,obj):
def __repr__(self):
return 'Sucessful'
import types
obj.__repr__ = types.MethodType(__repr__,obj)
return obj

t = inhtoy(inst)

事实上,如果我调用 t.repr() 它会起作用,但它不会覆盖原始的 repr。它显示为 <bound method inhtoy.__new__.<locals>.__repr__ of <__main__.toy object at 0x7f76e0b61f98>>一种局部方法。
打电话repr(t)仍然指向原始表示 '<__main__.toy object at 0x7f76e0b61f98>'但不是被覆盖的。

有没有办法正确地做到这一点?
谢谢

最佳答案

@Nullman 的回答有效,因为他们的解决方案实际上是更改类对象 toyt 是实例,而不是实例本身,就像您的方法那样。

特殊属性__class__引用实例所属的类对象。

print(t.__class__ is toy) # True

因此,t.__class__.__repr__ = my_custom_repr 分配给类 toy 上的 __repr__,而不是实例 t.

当比较您的方法和 Nullman 方法的 print(t.__repr__) 的输出时,这一点变得明显。假设模块级函数 __repr__ 如下所示:

def __repr__(self):
return repr(self.__class__)

您的解决方案显示:

<bound method __repr__ of <__main__.toy object at 0x00000000029E5A90>>

注意,它说 __main__.toy object
Nullman 的解决方案显示为:

<bound method __repr__ of <class '__main__.toy'>>

当您使用您的方法调用 t.__repr__() 时,您调用了您在实例 t 上设置的方法,因此它返回您让它重新调整的内容;示例中的字符串 Success
使用 repr() 时,然而,定义了输出:

A class can control what this function returns for its instances by defining a __repr__() method.

正如 Nullman 正确指出的那样,他们的方法将改变所有现有的 future 对象的行为,从 toy 实例化。


至于奇怪的名字,分配的方法在使用你的代码时显示:

<bound method inhtoy.__new__.<locals>.__repr__ of <__main__.toy object at 0x7f76e0b61f98>>

... 那是函数对象的 qualified name来自 __qualname__特殊属性。它是来自类 inhtoy 方法 __new__ 的局部范围内的函数 __repr__
说到这一点,通过 inhtoy 类的魔术方法 __new__ 传递实例 inst 并没有真正实现多少。您的代码在功能上等同于:

def __repr__(self):
return "Success"

inst.__repr__ = types.MethodType(__repr__, obj)

关于python - 如何为已经实例化的类 python 覆盖 __repr__ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55918808/

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