有没有pythonic
办法在不完全面向对象的情况下保持状态(例如,为了优化)?
为了更好地说明我的问题,这里有一个我在 JavaScript 中经常使用的模式示例:
var someFunc = (function () {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
在外部,这只是一个与其他函数一样的函数,不需要初始化对象或类似的东西,但是闭包允许一次计算值,然后我基本上将其用作常量。
Python 中的一个例子是优化正则表达式时 - 使用re.compile
和存储编译后的版本match
和search
操作很有用。
我知道在 Python 中执行此操作的唯一方法是在模块范围内设置一个变量:
compiled_regex = compile_my_regex()
def try_match(m): # In reality I wouldn't wrap it as pointlessly as this
return compiled_regex.match(m)
或者通过创建一个类:
class MatcherContainer(object):
def __init__(self):
self.compiled_regex = compile_my_regex()
def try_match(self, m):
self.compiled_regex.match(m)
my_matcher = MatcherContainer()
前一种方法是临时的,函数和在它上面声明的变量是否相互关联并不是很清楚。它还稍微污染了模块的命名空间,我对此不太满意。
后一种方法看起来很冗长,并且在样板上有点沉重。
我能想到的解决这个问题的唯一另一种方法是将任何像这样的函数分解到单独的文件(模块)中,然后只导入函数,这样一切都很干净。
更有经验的 Pythoners 有什么关于如何处理这个问题的建议吗?还是您只是不担心并继续解决问题?