4

シングルトンを実装しようとしていますが、モジュールをインポートするときに問題が発生しています。私のセットアップは次のとおりです。Python 2.7 を使用しています。

モジュール 1

class SingletonClass(object):
    def __new__(self, *args, **kwargs):
        if not self._instance:
            self._instance = super(SingletonClass, self).__new__(
                                self, *args, **kwargs)
        return self._instance

print SingletonClass()  #OUTPUT: 0x00000000030F1630
print SingletonClass()  #OUTPUT: 0x00000000030F1630 (Good, what I want)

モジュール 2

import SingletonClass

class AnotherClass:
    print SingletonClass.SingletonClass() #OUTPUT: 0x0000000003292208

モジュール内でシングルトンは機能していますが、別のモジュールでは、シングルトンは最初のモジュールと同じオブジェクトを返しません。理由はありますか?

編集

今のところ、動作することがわかった唯一のものを掲載します。これにはもっと良い解決策があると確信していますが、これは根本的な問題が何であるかをよりよく伝えていると思います。

モジュール 1

class SingletonParent(object):
    _instance = None

    def __new__(self, *args, **kwargs):
        if not self._instance:
            self._instance = super(SingletonParent, self).__new__(
                                self, *args, **kwargs)
        return self._instance

モジュール 2

import SingletonParent    
class SingletonClass(object):
        def __new__(self, *args, **kwargs):
            if not SingletonParent.SingletonParent._instance:
               SingletonParent.SingletonParent._instance = super(SingletonClass, self).__new__(
                            self, *args, **kwargs)
            return SingletonParent.SingletonParent._instance 

    print SingletonClass()  #OUTPUT: 0x00000000030F1630
    print SingletonClass()  #OUTPUT: 0x00000000030F1630

モジュール 3

import SingletonClass

class AnotherClass:
    print SingletonClass.SingletonClass() #OUTPUT: 0x00000000030F1630

解決策 (編集 3)

教訓: メイン関数をシングルトンと同じモジュールに置かないでください!

4

1 に答える 1

2

あなたの問題は、モジュールが 2 つの異なる名前で 2 回インポートされている可能性が最も高いです。

これをテストするには、次のようなものを追加します。

print "Being imported..."

module1.py

このメッセージが 2 回出力される場合、モジュールは 2 回インポートされており、それが問題です。これを修正するには、どこでも [0] をインポートするために同じ名前を使用していること、および でハッキングを行っていないことを確認してくださいsys.path

[0]: 技術的にはこれは必要ありませんが、簡単な修正です。

于 2012-06-12T01:59:33.020 に答える