2010-06-08 54 views
6

我想让我的Python类以这样一种方式工作,即当任何一个Class方法被调用时,首先执行一个默认方法,而不是在被调用的类中明确指定这个方法。一个例子可以帮助:)如何使每个类方法在执行之前调用指定的方法?

Class animals: 
    def _internalMethod(): 
     self.respires = True 

    def cat(): 
     self._internalMethod() 
     self.name = 'cat' 

    def dog(): 
     self._internalMethod() 
     self.name = 'dog' 

我想_internalMethod()被自动调用时,任何方法是从动物的一个实例调用,而不是在每个方法的Def明确说明它。有没有一个优雅的方式来做到这一点?

干杯,

回答

5

你可以使用一个元类和getattribute动态装饰所有方法(如果您正在使用Python 2,请务必从object子类!)。

另一种选择是仅仅对类修正,如:

def add_method_call(func, method_name): 
    def replacement(self, *args, **kw): 
     getattr(self, method_name)() 
     return func(self, *args, **kw) 
    return replacement 

def change_all_attrs(cls, added_method): 
    for method_name in dir(cls): 
     attr = getattr(cls, method_name) 
     if callable(attr): 
      setattr(cls, method_name, add_method_call(attr, added_method)) 

class animals(object): 
    ... 

change_all_attrs(animals, '_internalMethod') 

这是一种草率的,dir()不会得到超中的任何方法,你可能赶上属性和其他对象你不打算由于简单的callable(attr)测试。但它可能适合你。

如果使用Python 2.7+,您可以使用类装饰器,而不是在创建类后调用change_all_attrs,但效果是相同的(除非您必须重写change_all_attrs以使其成为装饰器)。

相关问题