2013-06-25 63 views
1

假设您有class Foo其中有4种方法和class FooDecorator。从这4种方法中,FooDecorator只需要修饰一种方法。使用__getattr__实现装饰器设计模式

从Pythonic/OO设计的角度来看,使用__getattr__将请求转发到装饰实例可以吗?这基本上会去除deocrator类中的很多样板代码。

例子:

class Foo(object): 

    def method_1(self): 
     return some, stuff 

    def method_2(self): 
     return some, stuff 

    def method_3(self): 
     return some, stuff 

    def method_4(self): 
     return some, stuff 

class FooClassicDecorator(object): 
    def __init__(self, foo_instance): 
     self._foo_instance = foo_instance 

    def method_1(self): 
     returned = self._foo_instance.method_1() 
     return decorate_result(returned) 

    def method_2(self): 
     return self._foo_instance.method_2() 

    def method_3(self): 
     return self._foo_instance.method_3() 

    def method_4(self): 
     return self._foo_instance.method_4() 

class FooGetattrDecorator(ojbect): 
    def __init__(self, foo_instance): 
     self._foo_instance = foo_instance 

    def __getattr__(self, attr_name): 
     return getattr(self._foo_instance, attr_name) 

    def method_1(self): 
     returned = self._foo_instance.method_1() 
     return decorate_result(returned) 

你觉得哪个更优雅? FooClassicDecoratorFooGetattrDecorator

+0

我不认为我会使用。我只是继承'Foo'并重写一个方法。 – Aya

+0

@Aya Yea ...但装饰者的要点是你应该能够修饰已经存在的实例。以维基百科为例,你应该可以做Sprinkles(Milk(Whip(SimpleCoffe())))或者通过做牛奶(Milk(SimpleCoffe()))来拿铁。组合的数量或者应用装饰器的顺序可能很大。 –

+0

为什么不使用Python [装饰器](http://www.python.org/dev/peps/pep-0318/)呢? – Aya

回答