-1

在这里,我继承了一个 wxPython 类并定义了一个名为singleton.

class AddressCellAttr(wx.grid.GridCellAttr):
    _instance = None

    def __init__(self):
        wx.grid.GridCellAttr.__init__(self)

        self.SetTextColour('#0000FF')

    @classmethod
    def singleton(cls):
        if cls._instance == None:
            cls._instance = cls()

        return cls._instance

class ValidAddressCellAttr(AddressCellAttr):
    def __init__(self):
        AddressCellAttr.__init__(self)

        self.SetTextColour('#00FF00')

class CorrectedAddressCellAttr(AddressCellAttr):
    def __init__(self):
        AddressCellAttr.__init__(self)

        self.SetTextColour('#FFFF00')

class InvalidAddressCellAttr(AddressCellAttr):
    def __init__(self):
        AddressCellAttr.__init__(self)

        self.SetTextColour('#FF0000')

class UnparsableAddressCellAttr(AddressCellAttr):
    def __init__(self):
        AddressCellAttr.__init__(self)

        self.SetTextColour('#555555')

其余类是第一个子类的子类。我认为单例类方法也适用于所有子类,因为它在类上运行,并且子类确实是一个单独的类。

发生的情况是,在我调用singleton一次 on之后AddressCellAttr,单例方法也会在所有子类上返回相同的对象。为什么会这样?

4

2 回答 2

0

好的,我在写这个问题时自己想出了这个问题。事实证明,当调用单例方法时,它确实接收到正确的子类作为参数,但由于子类没有具体定义_instance任何地方,cls._instance因此将查找类链AddressCellAttr与原始_instance.

解决方案是专门_instance为每个子类定义,如下所示:

class ValidAddressCellAttr(AddressCellAttr):
    _instance = None

    def __init__(self):
        AddressCellAttr.__init__(self)

        self.SetTextColour('#00FF00')

等等。

于 2012-11-29T23:31:52.833 回答
0

不知道为什么你认为你需要一个单例模式,但无论如何,你真的应该在__new__.

class Singleton(object):

    def __new__(cls):

        try:
            return cls._instance
        except AttributeError:
            cls._instance = object.__new__(cls)
            return cls._instance

只需确保所有子类都调用 parent __new__(),并记住 and 的签名__new__()必须__init__()匹配。

于 2012-11-29T23:58:12.143 回答