Хотя специальные методы 'двойного подчеркивания', такие как __del__
, __str__
, __repr__
и т. Д., Могут быть исправлены обезьянами на уровне экземпляра, они будут просто игнорироваться, если только они не вызваны напрямую (например, если вы примете ответ Omnifarious: del a
не будет печатать что-либо, но a.__del__()
будет).
Если вы все еще хотите обезьяньим патчем один экземпляр a
класса A
во время выполнения, решение состоит в том, чтобы динамически создать класс A1
, производный от A
, а затем изменить класс a
на вновь созданный A1
.Да, это возможно, и a
будет вести себя так, как будто ничего не изменилось - за исключением того, что теперь он включает в себя ваш исправленный метод обезьяны.
Вот решение на основе обобщенной функции, которую я написал для другого вопроса: Тайна разрешения метода Python
def override(p, methods):
oldType = type(p)
newType = type(oldType.__name__ + "_Override", (oldType,), methods)
p.__class__ = newType
class Test(object):
def __str__(self):
return "Test"
def p(self):
print(str(self))
def monkey(x):
override(x, {"__del__": p})
a=Test()
b=Test()
monkey(a)
print "Deleting a:"
del a
print "Deleting b:"
del b