11

次の内容のmainとxの2つのモジュールがあるとします。

主要:

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        cls._instance.x = 10
        return cls._instance
uvw = Singleton()

if __name__ == "__main__":
    print(id(uvw))
    uvw.x += 10
    print(uvw.x)
    import x

それぞれとx:

import main

print(id(main.uvw))
print(main.uvw.x)

mainを実行すると、両方のインスタンスで同じIDと値20が生成されると期待しますが、取得するのは次のとおりです。

$ python main.py
140592861777168
20
140592861207504
10

uvw両方の場所で同じオブジェクトであることを確認する方法はありますか?

4

3 に答える 3

8

問題は、Singletonクラスが何らかの形でリロードされている_instanceため、2番目のモジュールでそのフィールドが失われることだと思います。


私はこれがうまくいくと思います:

singleton.py

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        cls._instance.x = 10
        return cls._instance

a.py

from singleton import Singleton
uvw = Singleton()
print(id(uvw))
uvw.x += 10
print(uvw.x)

b.py

from singleton import Singleton
uvw = Singleton()
print(id(uvw))
uvw.x += 10
print(uvw.x)

main.py

import a
import b
于 2012-11-11T12:16:00.927 に答える
7

Pythonは、各モジュールを名前で1回ロードします(reload(module)呼び出されない限り)。を実行するmain.pyと、モジュールは__main__(印刷してみてくださいuvw.__class__.__module__)です。xインポートするmainと、呼び出されたモジュールmainが初めてロードされます。

uvw3番目のモジュール、またはで定義した場合、同じ方法でインポートされxている限り、同じオブジェクトになります。__main__x

于 2012-11-11T12:20:35.053 に答える
1

問題はmain、コマンドラインから実行したときに2回読み込まれ、1回目は__main__として、2回目はxによってインポートされたときに読み込まれることmainです。

私は2番目の負荷を回避するための非常に邪悪なハックを見つけました:

sys.modules["main"] = sys.modules["__main__"]

私の場合、メインモジュールとシングルトンクラスを分離することは好ましくありません。

于 2012-11-11T12:16:56.583 に答える