Python-borg模式问题

2024-04-27 10:06:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用python实现borg时遇到问题。我在this question的答案中找到了一个例子,但它对我不起作用,除非我遗漏了什么。代码如下:


class Config:
    """
    Borg singleton config object
    """
    __we_are_one = {}
    __myvalue = ""

    def __init__(self):
        #implement the borg pattern (we are one)
        self.__dict__ = self.__we_are_one
        self.__myvalue = ""

    def myvalue(self, value=None):
        if value:
           self.__myvalue = value
        return self.__myvalue

conf = Config()
conf.myvalue("Hello")
conf2 = Config()
print conf2.myvalue()

我想这是要打印“你好”,但对我来说它只是打印一个空行。你知道为什么吗?


Tags: 答案selfconfigvalueconfdefthisone
3条回答

结合删除self.__myvalue = ""new-style Borg以及避免变量名中__的建议,我们得到:

class Config(object):
    """
    Borg singleton config object
    """
    _we_are_one = {}
    _myvalue = ""

    def __new__(cls, *p, **k):
        self = object.__new__(cls, *p, **k)
        self.__dict__ = cls._we_are_one
        return self

    def myvalue(self, value=None):
        if value:
           self._myvalue = value
        return self._myvalue

if __name__ == '__main__':
    conf = Config()
    conf.myvalue("Hello")
    conf2 = Config()
    print conf2.myvalue()

问题似乎是init()正在将myvalue重置为空字符串。当我删除那一行时,我得到了预期的输出。

它看起来工作得太好了:-)

问题是,每当一个新的Borg被创建时,__init__中的赋值self.__myvalue = ""总是会删除myvalue的值。如果在测试中添加一些附加的打印语句,则可以看到这一点:

conf = Config()
conf.myvalue("Hello")
print conf.myvalue()  # prints Hello
conf2 = Config()
print conf.myvalue()  # prints nothing
print conf2.myvalue() # prints nothing

去掉self.__myvalue就没事了。

尽管如此,实现myvalue()有点奇怪。我想说,最好是让显式的getter和setter使用属性。您还需要__init__中的一些代码来初始化myvalue的值(如果它还不存在),或者至少处理它可能不存在于getter中。可能是这样的:

class Config(object):
    """
    Borg singleton config object
    """
    _we_are_one = {}

    def __init__(self):
        #implement the borg pattern (we are one)
        self.__dict__ = self._we_are_one

    def set_myvalue(self, val):
        self._myvalue = val

    def get_myvalue(self):
        return getattr(self, '_myvalue', None)

    myvalue = property(get_myvalue, set_myvalue)

c = Config()
print c.myvalue # prints None
c.myvalue = 5
print c.myvalue # prints 5
c2 = Config()
print c2.myvalue #prints 5

相关问题 更多 >