-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')

残りのクラスは、最初のサブクラスのサブクラスです。シングルトン クラス メソッドは、クラスで動作するため、すべてのサブクラスでも機能し、サブクラスは実際には別のクラスであると考えました。

singletonon を 1 回呼び出した後AddressCellAttr、singleton メソッドはすべてのサブクラスでも同じオブジェクトを返します。なぜこれが起こるのですか?

4

2 に答える 2

0

OK、質問を書いているときに、これを自分で考え出しました。シングルトン メソッドが呼び出されると、実際には正しいサブクラスをパラメーターとして受け取りますが、サブクラスは特に_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__()があることを覚えておいてください。__new__()__init__()

于 2012-11-29T23:58:12.143 に答える