最近在看sqlalchemy源码,看到根据模块的字符串作为参数,使用__import__方法动态的导入数据库驱动模块,其实也就是一个类,但是它加了缓存,也就是相同的字符串只需要执行一次动态导入,剩下的直接在缓存里找到并返回。
我疑问的是:源码缓存字典里存的是类工厂函数(我自己的说法,不知正确与否),和直接存类的引用有什么区别?
我使用以下的代码演示:
cache函数直接缓存类的引用,new_cahe缓存的是类的工厂函数
impls = {}
new_impls = {}
class A(object):
def hello(self):
print 'hello A'
def cache(val):
if val in impls:
print 'go cache'
return impls[val]
impls[val] = A
return A
def new_cache(val):
if val in new_impls:
print 'go new cache'
return new_impls[val]()
loader = lambda: A
new_impls[val] = loader
return loader()
以下是我的测试过程,
if __name__ == '__main__':
print id(A) #49555272
a = cache('test')
print impls #{'test': }
print id(a) #49555272
b = cache('test')
print id(b) #49555272
print '-------------------'
a_n = new_cache('wei')
print new_impls #{'wei': at 0x000....>}
print id(a_n) #55259736
c = a_n()
c.hello() #hello A
b_n = new_cache('wei')
print id(b_n) #55259736
d = b_n()
d.hello() #hello A
使用结果给我感觉好像并没与什么区别,不知道这个用法有什么特别用意吗?
如果有知道的,请告诉我为什么这么做,先谢谢了!