有没有在不完全面向对象的情况下保持状态的方法(例如,为了优化的目的)?
为了更好地说明我的问题,下面是我在javascript中经常使用的模式示例:
var someFunc = (function () {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
从外部来说,这只是一个与其他任何函数一样的函数,不需要初始化对象或类似的东西,但是这个闭包允许计算一次值,然后我基本上将其用作常量。
在python中的一个例子是在优化正则表达式时——使用
pythonic
并为re.compile
和match
操作存储编译版本是很有用的。在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()
前一种方法是临时的,不太清楚上面声明的函数和变量是相互关联的。它也会稍微污染模块的名称空间,我对此不太满意。
后一种方法似乎冗长而有点繁琐。
我能想到的另一种处理方法是将类似这样的函数分解成单独的文件(模块),然后只导入函数,这样所有的东西都是干净的。
有经验的蟒蛇对如何处理这个问题有什么建议吗?还是你不担心,继续解决问题?
最佳答案
您还可以使用默认参数来完成此操作:
def try_match(m, re_match=re.compile(r'sldkjlsdjf').match):
return re_match(m)
因为默认参数在模块导入时只计算一次。
或者更简单:
try_match = lambda m, re_match=re.compile(r'sldkjlsdjf').match: re_match(m)
或者是最简单的:
try_match = re.compile(r'sldkjlsdjf').match
这不仅节省了重新编译的时间(实际上在re模块内部缓存),而且还节省了查找“.match”方法的时间。在一个繁忙的函数或一个紧凑的循环中,这些''分辨率可以相加。
关于python - 如何在没有类的情况下在Python中维护状态?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11866419/