【发布时间】:2019-09-18 23:45:29
【问题描述】:
我正在使用一个第 3 方库,它的类的 repr 很差,我想在创建该类的实例后覆盖它。
我看到了如何在现有对象中创建绑定方法。
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>' 但不是被覆盖的表示。
有没有办法正确地做到这一点?
谢谢
【问题讨论】:
-
尽管他们的
__repr__可能很糟糕,但用您自己的替代品替换它会更加混乱。 -
虽然我也想知道如何对实时实例执行此操作,但为什么不子类化他们的类并只更改
__repr__? -
@Nullman 因为子类化需要用户继承它。它还会更改类名,生成与第 3 方库不兼容的问题。修改对象保持一切不变。
标签: python attributes new-operator overwrite