2013-01-16 2 views
4

В интерактивной сессии Python, я иногда делать тупые вещи, какКак отремонтировать метод clobbered объекта Python?

plot.ylimits = (0,100) 

где участок является экземпляром некоторого класса Plot и ylimits способ для этого. Я должен был постучал в этом:

plot.ylimits(0,100) 

отменной Python работу, объект участка теперь имеет новый член с именем ylimits, которые удерживают кортеж в качестве своего значения, и метод, выполняемая подпрограмма, первоначально предоставленный классом Plot , который использовался для вызова с ylimits (...). Может быть, где-то в моем сознании я думаю, что ylimits - это свойство, и назначение ему вызывает какой-то скрытый метод setter, как это делается на некоторых других языках.

Как я могу вернуть этот метод? Как можно восстановить объект моего сюжета, оставаясь в интерактивном сеансе, где я использую много других переменных, функций и т. Д.?

Я нахожу, что перезагрузка (theplotmodule) не выполняет эту работу. Я разрушил конкретный экземпляр Plot; обновление определения класса Plot и других вещей не помогает.

Я использую Python 2.7

ответ

7

Простой способ сделать del plot.ylimits. В общем, методы определены в классе, а не в экземпляре. Python просто просматривает атрибуты каждый раз, когда вы пытаетесь получить к ним доступ, и когда он не находит их в экземпляре, он переходит в класс. Когда вы сделали plot.ylimits=(0,100), вы создали новый атрибут экземпляра, поэтому Python останавливается и не ищет атрибут класса, хотя он все еще существует. del plot.ylimits удалит атрибут экземпляра, и теперь plot.ylimits снова получит доступ к методу, просмотрев его в классе.

Обратите внимание, что это работает только тогда, когда вещь, которую вы перезаписали, первоначально была на классе, а не на экземпляре. Если на самом деле у вас есть данные, хранящиеся в экземпляре, и вы перезаписываете его, он уходит навсегда.

+0

Хорошее объяснение того, почему это разумный вариант (моя первая мысль состояла в том, чтобы просто присвоить его соответствующему методу 'Plot') –

1

Ах, ответ BrenBarn настолько намного лучше, чем у меня, но все-таки ...

Назначают его обратно, используя метод из класса участков (при условии, что вы не держите связанный метод) и преобразования его в MethodType , как это:

class C: 

    def f(self): 
     print "hello!" 

c = C() 

c.f = "opps!" 

import types 
c.f = types.MethodType(C.f, c) 

c.f() 
0

ipython notebook использования, то вы можете повторно запустить и изменить сегмент кода, как вы хотите.

ipython notebook - интерактивный интерпретатор python, который использует браузер в качестве интерфейсного. Вид боли для первоначальной настройки, но отлично подходит для поискового кодирования.

Смежные вопросы