Если вам когда-либо понадобится сделать это для специального метода (который для класса нового стиля - который вы всегда должны использовать и единственный вид в Python 3 - просматривается класс, а не экземпляр), вы можете просто создать класс для экземпляра, например ...:
self.foo = Foo()
meths = {'__str__': lambda self: 'peekaboo!'}
self.foo.__class__ = type('yFoo', (Foo,), meths)
Редактировать : меня попросили уточнить преимущества этого подхода по сравнению с new.instancemethod ...:
>>> class X(object):
... def __str__(self): return 'baah'
...
>>> x=X()
>>> y=X()
>>> print x, y
baah baah
>>> x.__str__ = new.instancemethod(lambda self: 'boo!', x)
>>> print x, y
baah baah
Как видите, метод new.instance совершенно бесполезен в этом случае. Ото ...:
>>> x.__class__=type('X',(X,),{'__str__':lambda self:'boo!'})
>>> print x, y
boo! baah
... назначение нового класса прекрасно работает в этом и во всех других случаях. Кстати, как я надеюсь, ясно, как только вы сделали это с данным экземпляром, вы можете позже добавить больше метода и других атрибутов класса к его x.__class__
и по сути повлиять только на этот один экземпляр!