有没有在不完全面向对象的情况下保持状态的方法(例如,为了优化的目的)?
为了更好地说明我的问题,下面是我在javascript中经常使用的模式示例:

var someFunc = (function () {
    var foo = some_expensive_initialization_operation();
    return someFunc (bar) {
        // do something with foo and bar
    }
}());

从外部来说,这只是一个与其他任何函数一样的函数,不需要初始化对象或类似的东西,但是这个闭包允许计算一次值,然后我基本上将其用作常量。
在python中的一个例子是在优化正则表达式时——使用pythonic并为re.compilematch操作存储编译版本是很有用的。
在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/

10-12 01:33