1

編集:私がちょうど知ったように、「シングルトン」はPythonではそれほど役に立ちません。pythonは代わりに「Borg」を使用します。http://wiki.python.de/Das%20Borg%20Pattern Borgを使用すると、次のようなさまざまなクラスのグローバル変数を読み書きできました。

b1 = Borg()
b1.colour = "red"
b2 = Borg()
b2.colour
>>> 'red'

しかし、私は次のようなボーグでリストを作成/読み取ることができませんでした:

b1 = Borg()
b1.colours = ["red", "green", "blue"]
b2 = Borg()
b2.colours[0]

これはBorgがサポートしていないものですか?はいの場合:さまざまなクラスから読み書きできるグローバルリストを作成するにはどうすればよいですか?


元の質問:

さまざまなクラスのグローバル変数を読み書きしたい。擬似コード:

class myvariables():
    x = 1
    y = 2

class class1():
    # receive x and y from class myvariables
    x = x*100
    y = y*10
    # write x and y to class myvariables

class class2():
    # is called *after* class1
    # receive x and y from class myvariables
    print x
    print y

printresultは「100」と「20」である必要があります。「シングルトン」でこれができると聞きましたが…「シングルトン」の説明が見つかりませんでした。この単純なコードを機能させるにはどうすればよいですか?

4

1 に答える 1

2

ボーグ パターン クラスの属性は、新しいインスタンスの呼び出しではリセットされませんが、インスタンスの属性はリセットされます。以前に設定した値を保持したい場合は、インスタンス属性の代わりにクラス属性を使用していることを確認してください。以下のコードは、あなたが望むことを行います。

class glx(object):
    '''Borg pattern singleton, used to pass around refs to objs. Class
    attrs will NOT be reset on new instance calls (instance attrs will).
    '''
    x = ''
    __sharedState = {}
    def __init__(self):
        self.__dict__ = self.__sharedState
        #will be reset on new instance 
        self.y = ''  


if __name__ == '__main__':
    gl = glx()
    gl.x = ['red', 'green', 'blue']
    gl2 = glx()
    print gl2.x[0]

その点を証明するために、インスタンス属性でもう一度試してみてください。不幸な結果が得られます。

がんばれ、マイク

于 2012-09-29T02:35:08.417 に答える