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)
你觉得哪个更优雅? FooClassicDecorator
或FooGetattrDecorator
?
我不认为我会使用。我只是继承'Foo'并重写一个方法。 – Aya
@Aya Yea ...但装饰者的要点是你应该能够修饰已经存在的实例。以维基百科为例,你应该可以做Sprinkles(Milk(Whip(SimpleCoffe())))或者通过做牛奶(Milk(SimpleCoffe()))来拿铁。组合的数量或者应用装饰器的顺序可能很大。 –
为什么不使用Python [装饰器](http://www.python.org/dev/peps/pep-0318/)呢? – Aya