用于类方法的Decorator“模板”不能是类方法吗?

时间:2015-09-10 09:51:07

标签: python python-decorators

我有一个类的层次结构,有很多类似的方法,我已经设法分解了使用闭包和装饰器的常见部分:

def makemethod(kernel_method, output_class):
    def closure(self, start, end):
        set().up()
        common()
        stuff()
        result = []
        for i in range(start, end):
            args = more().standard().stuff()
            result.append(kernel_method(self, args))
        finish().up()
        return output_class(result)
    return closure

def mymethod(output_class):
    def decorator(kernel_method):
        return makemethod(kernel_method, output_class)
    return decorator

遵循模式的每个方法,无论是基类中定义的方法还是派生类,只需定义其“内核”并使用装饰器将其包装在公共代码中:

@mymethod(Class1)
def a_method_that_builds_a_Class1(self, args):
    # just the kernel!

@mymethod(Class2)
def a_method_that_builds_a_Class2(self, args):
    # just the kernel!

@mymethod(Class2)
def a_different_way_to_build_a_Class2(self, args):
    # just the kernel!

所有这一切都很美妙,完全符合我的要求。唯一的问题是,为了使它工作,我必须在我的基类的之外定义makemethod函数及其装饰器包装作为模块级函数,这看起来非常奇怪对我来说(虽然可能在Python中它根本不奇怪?)

内部函数closure完全没有意义,除非作为我的类的方法(它使用各种类属性的“常见东西”),所以它在里面定义的外部函数应该是一个类会员,对吗?但是如果我尝试将外部函数设置为静态或我的基类的类方法,我可以使用它们来装饰派生类的方法,但是我不能在基类本身中调用它们,因为在类的定义中它自己的名字还不在范围内。我的基类确实有需要装饰的方法。

我想我可以将闭包和装饰器放在一个类中,并让我的“基类”继承自该类。这是我应该做的,或者在Python中用于闭包/装饰器“模板”的方式是模块级函数的风格是否合适?

0 个答案:

没有答案