在导入期间向类添加静态值

时间:2018-01-27 12:21:46

标签: python

我有一个课程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的实例时,它就会神奇地拥有该预设。现在,我知道这不会像我写的那样起作用 - 但是有什么东西可以接近吗?

3 个答案:

答案 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解释器的所有代码库中的缓存类和缓存模块都是相同的。