Я уже понял ответ на этот вопрос, поэтому я размещаю его здесь как вопрос для себя - ради тех, которые могут возникнуть с похожим вопросом.Уничтожить метод объекта после первого вызова
В принципе, я хотел бы иметь возможность удалить метод объекта. Причина?
У меня есть действие, которое должно выполняться один раз в жизни объекта. Это действие не может быть помещено в метод __init__, так как мне нужна система, полностью инициализированная до ее выполнения.
У меня есть подходящее место для этого действия - метод, существующий в родительском классе. Но я хотел бы иметь возможность избежать проверки условия каждый раз, когда метод вызывается инфраструктурой.
Так что я попробовал этот подход:
In [193]: class Parent(object):
def place_for_action(self):
print 'This is parent'
.....:
In [194]: class Child(Parent):
def place_for_action(self):
super(Child, self).place_for_action()
print 'This is child'
delattr(self, 'place_for_action')
.....:
Когда я попробовал, мне не удалось
In [186]: c= Child()
In [187]: c.place_for_action()
This is child
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/homes/markg/<ipython-input-187-da53ac96ffa9> in <module>()
----> 1 c.place_for_action()
/homes/markg/<ipython-input-185-7037db53bd87> in do_once(self)
2 def place_for_action(self):
3 print 'This is child'
----> 4 delattr(self, 'place_for_action')
5
AttributeError: 'Child' object attribute 'place_for_action' is read-only
Что? Почему вы не можете сделать это в конце '__init__'? Какая другая инстанция требуется? – jonrsharpe
@jonrsharpe Это сложная графическая реализация. Действие заключается в отправке сигналов другим компонентам системы, и нет гарантии, что компоненты будут инициализированы в то время – volcano
Я сомневаюсь, что это необходимо, но это трудно сказать, не видя больше вашего фактического кода. – chepner