如何为已经实例化的python类覆盖_repr__;方法
我正在使用一个第三方库,该库对某个类的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
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无效;如果你还感兴趣。。。