我有一个类的层次结构,有很多类似的方法,我已经设法分解了使用闭包和装饰器的常见部分:
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中用于闭包/装饰器“模板”的方式是模块级函数的风格是否合适?