首次调用后销毁对象方法

时间:2014-09-18 13:25:31

标签: python python-2.7

我已经找到了答案,所以我把它放在这里作为一个问题给自己 - 为了那些可能提出类似问题的人。

基本上,我希望能够删除对象方法。原因?

我有一个每个对象生命必须执行一次的动作。此操作无法放在 __ 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

1 个答案:

答案 0 :(得分:4)

好的,答案是 - 类级别的删除方法 - 适合我的需要

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