如何为已经实例化的python类覆盖_repr__;方法

如何为已经实例化的python类覆盖_repr__;方法,python,attributes,new-operator,overwrite,Python,Attributes,New Operator,Overwrite,我正在使用一个第三方库,该库对某个类的repr很差,我希望在创建该类的实例后覆盖它 我了解了如何在现有对象中创建绑定方法 class toy(): pass inst= toy() class inhtoy(): def __new__(cls,obj): def __repr__(self): return 'Sucessful' import types obj.__repr__ = types.Me

我正在使用一个第三方库,该库对某个类的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。它显示为
一种局部方法。
调用
repr(t)
仍然指向原始表示形式
'
,但不是覆盖的表示形式

有什么方法可以正确地做到这一点吗?

谢谢

环顾四周后,我找到了答案。在活动实例上执行此操作的方法是:

t.__class__.__repr__ = my_custom_repr

请注意,这将更改所有类实例而不仅仅是此实例

您可以使用继承来创建从感兴趣的类派生的新类,然后重写repr方法

class inhtoy(toy):

    def __init__(self):
        toy.__init__(self)

    def __repr__(self):
        # Your repr method

@Nullman的答案是有效的,因为他们的解决方案实际上是更改类对象
toy
,而
t
是的一个实例,而不是您的方法所做的实例本身

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

print(t.__class__ is toy) # True
因此,
t.。\uuuuu class\uuuuuuuuuuu repr\uuuuuuuuuu=my\u custom\u repr
在类
toy
上分配给
,而不是在实例
t

在比较您的方法和Nullman的方法之间的
print(t.\uuu repr\uuuu)
输出时,这一点变得可见。假设模块级函数
\uuuu repr\uuu
如下所示:

def __repr__(self):
    return repr(self.__class__)
class Toy():
    pass
inst = Toy()  # from 3rd party library

class Toy_MyRepr(Toy):
    def __repr__(self):
        return '<my repr of Toy instance >'

inst.__class__ = Toy_MyRepr
您的解决方案显示:

<bound method __repr__ of <__main__.toy object at 0x00000000029E5A90>>
当您使用您的方法调用
t.\uuu repr\uuu()
时,您调用您在实例
t
上设置的方法,因此它返回您使其重新运行的方法;示例中的字符串
Success

但是,使用时,类定义了输出:

类可以通过以下方式控制此函数为其实例返回的内容 定义
\uuuu repr\uuuu()方法

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


对于奇怪的名称,指定的方法在使用代码时显示:

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

使用子类并将其分配给实例,从库中获得的实例如下:

def __repr__(self):
    return repr(self.__class__)
class Toy():
    pass
inst = Toy()  # from 3rd party library

class Toy_MyRepr(Toy):
    def __repr__(self):
        return '<my repr of Toy instance >'

inst.__class__ = Toy_MyRepr
class Toy():
通过
inst=Toy()#来自第三方库
玩具类(玩具):
定义报告(自我):
返回“”
安装类别=玩具

尽管他们的
\uuuu repr\uuuu
可能很糟糕,但用自己的替代品替换它会让人更加困惑。虽然我也想知道如何对活动实例执行此操作,但为什么不对他们的类进行子类化,只需更改
\uu repr\uuuuuu
?@Nullman,因为子类化需要用户继承它。它还将更改类名,从而导致与第三方库不兼容。修改对象使一切保持不变。好吧,就我而言,它会起作用的。你知道为什么它是这样工作的吗?不幸的是没有,但如果你明白了,如果你允许我,我会很高兴的know@Nullman我添加了一个答案,试图解释为什么您的解决方案有效而OP无效;如果你还感兴趣。。。