2014-09-18 2 views
1

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

В принципе, я хотел бы иметь возможность удалить метод объекта. Причина?

У меня есть действие, которое должно выполняться один раз в жизни объекта. Это действие не может быть помещено в метод __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 
+0

Что? Почему вы не можете сделать это в конце '__init__'? Какая другая инстанция требуется? – jonrsharpe

+0

@jonrsharpe Это сложная графическая реализация. Действие заключается в отправке сигналов другим компонентам системы, и нет гарантии, что компоненты будут инициализированы в то время – volcano

+0

Я сомневаюсь, что это необходимо, но это трудно сказать, не видя больше вашего фактического кода. – chepner

ответ

4

OK, ответ был - удалить метод на уровне класса - который подходит моя потребность

In [195]: class Child(Parent): 
    def place_for_action(self): 
     super(Child, self).place_for_action() 
     print 'This is child' 
     delattr(self.__class__, 'place_for_action') 
    .....:   

Работает как очарование

In [196]: c = Child() 

In [197]: c.place_for_action() 
This is parent 
This is child 

In [198]: c.place_for_action() 
This is parent 
Смежные вопросы