我有一个课程cacheHelper
,其中包括以下内容:
import sys
sys.path.append('../../../utilities/')
from cache import cacheHelper
稍后,在我的代码中,我使用此类来访问缓存:
helper = cacheHelper(folder='../../cache/', fileName='fileName', attr=attrs)
与folder
相关的部分非常简单:
class cacheHelper():
def __init__(self, fileName, attr=[], folder='../cache/', sanitize=True):
# sanitize: round input numbers.
self.folder = folder
现在,每当我在项目中启动cacheHelper
时,我都需要告诉它folder
它可以读/写的位置。我无法在构造函数中使用默认值,因为它不能是项目特定的。
这样做的一种方法是在我想要缓存的每个函数中携带对cacheFolder
的引用,然后传递cacheHelper(folder=cacheFolder)
。
看起来很乱。我可以在文件级别上做些什么,也许是在包含文件的过程中?
我的梦想解决方案将是
from cache import cacheHelper(folder='../../cache')
,然后每当我使用cacheHelper
的实例时,它就会神奇地拥有该预设。现在,我知道这不会像我写的那样起作用 - 但是有什么东西可以接近吗?
答案 0 :(得分:1)
只需编写一个帮助函数,使用正确的默认值调用该函数:
def newCacheHelper (fileName, attr, sanitize=True, folder='../../cache/'):
return cacheHelper(fileName, attr, folder, sanitize)
您甚至可以用新的替换现有的:
originalCacheHelper = cacheHelper
def cacheHelper (fileName, attr, sanitize=True, folder='../../cache/'):
return originalCacheHelper(fileName, attr, folder, sanitize)
将它放入您自己的模块并从那里导入cacheHelper
,您无需在代码中调整任何内容即可使用正确的文件夹。
答案 1 :(得分:1)
继承怎么样:
class ProcjetCacheHelper(cacheHelper):
def __init__(self, fileName, attr=[], folder='../../cache_project/', sanitize=True):
super().__init__(fileName=fileName, attr=attr, folder=folder, sanitize=sanitize)
helper = ProcjetCacheHelper('fn')
print(helper.folder)
输出:
../../cache_project/
当然,您可以相应地更改名称,这样您就可以在所有地方继续写cacheHelper
:
from cache import cacheHelper as OriginalCacheHelper
class ProcjetCacheHelper(OriginalCacheHelper):
def __init__(self, fileName, attr=[], folder='../../cache_project/', sanitize=True):
super().__init__(fileName=fileName, attr=attr, folder=folder, sanitize=sanitize)
cacheHelper = ProcjetCacheHelper
答案 2 :(得分:0)
首先,我建议再一次考虑这个问题;在大多数情况下,全球状态不是你需要的东西。
在高级别,您需要singleton
在某种程度上,您可以在__new__
方法中手动实现此功能,但我不建议这样做。 Python导入系统机器被高度缓存。意思是,每个模块只有一个实例(连同里面的所有类)存在。因此,如果您认为真正需要此类功能,则可以将您的状态置于模块范围内,例如
_path = '../folder'
class Cache:
def do_some(self, arg):
return arg * _path
每个应用程序只需调用一次`cache_module._path =' ../ other'
其他脏的方法是将此路径放在类中,如类属性
class Cache:
path = '../folder'
@classmethod
def do_some(cls, arg):
return arg * cls.path
每个应用一次,您使用Cache.path = '../other'
设置缓存。每个python解释器的所有代码库中的缓存类和缓存模块都是相同的。