2

假设你有class Foo4 个方法和class FooDecorator. 从这 4 种方法中,FooDecorator只需要装饰一种方法。

从 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

4

1 回答 1

1

我发现了另一个非常相似的问题。投票和接受的最高答案似乎与我的 FooGetattrDecorator 非常相似

在 Python 中实现装饰器模式

关闭它并标记为重复。

于 2013-06-25T23:32:53.970 回答