有没有pythonic
维护状态的方法(例如为了优化目的),而没有完全面向对象?如何在没有类的情况下在Python中维护状态?
为了说明我的问题比较好,这是我在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()
前一种方式是广告-hoc,并且它不是很清楚该函数和它上面声明的变量是相互关联的。它也污染了模块的命名空间,我不太满意。
后一种方法在样板上看起来冗长而有点沉重。
我能想到的唯一方法就是将所有这些功能都分解成单独的文件(模块)并只导入函数,这样一切都很干净。
有关如何处理此问题的更多经验丰富的Pythoners的任何建议?或者你只是不担心它,继续解决问题?
我个人认为你的班级创作没有问题。详细程度很好。 “'显式比隐式更好。” – tMC 2012-08-08 14:18:50
一种至少使用该类的方法不会太冗长,那就是将'try_match'重命名为'__call__',它可以让你像构造函数一样使用它(构造之后)。但是,正如在@ glglgl的回答中,您的JavaScript代码实际上直接转换为Python。 – lvc 2012-08-08 14:27:03
是否在第一个例子中调用someFunc?还是应该是函数定义? – soulcheck 2012-08-08 14:46:50