2016-06-21 10 views
1

は、私はすでに私が思っていた Creating a singleton in Pythonクラスのメソッドと属性を持つクラスは、Pythonではシングルトンですか?

のように、Pythonでシングルトンを実装する方法を説明し、多くの記事を読んで、クラスメソッドを持つクラスではなく、属性シングルトンクラスです。

class my_singleton_class(object): 

    _logger = Logger() 
    _printer = Printer() 

    @classmethod 
    def logger(cls): 
     return cls._logger 

    @classmethod 
    def printer(cls): 
     return cls._printer 

pythonicではありませんか?このシングルトン実装で何が問題になっていますか?

+0

これを見てください:http://stackoverflow.com/questions/1318406/why-is-the-borg-pattern-better-than-the-singleton-pattern-in-python – phogl

答えて

6

私は不思議に思っていましたが、クラスメソッドを持つクラスではなく、属性はシングルトンクラスです。定義により

はシングルトンクラスでは、以上の1つのインスタンスを作成することはできませんクラスです。

のテストにそれを置くましょう:

class my_singleton_class(object): 
    _logger = 1 
    _printer = 2 

    @classmethod 
    def logger(cls): 
     return cls._logger 

    @classmethod 
    def printer(cls): 
     return cls._printer 

print(id(my_singleton_class())) 
print(id(my_singleton_class())) 
>> 8322128 
>> 8322192 

我々は明らかにこのクラスの2つの異なるインスタンスを作成するために管理。

これらのインスタンスが共有属性を持つという事実は、このクラスをシングルトンにしません。

+0

シングルトンリソースを共有する必要があります。ロガーやプリンタのような複数のリソースインスタンスがあってはいけませんか? – deepak

+0

しかし、2つのインスタンスはリソースの共有を強制されません。作成後、各インスタンスの任意の属性を個別に作成して割り当てることができます。 'a = my_singleton_class(); b = my_singleton_class(); a.foo = "bar"; b.x = 3 'となる。 – chepner

+0

@DeepSpace実装によっては、作成する2つの匿名インスタンスが同じIDを持つ可能性があります。これは、2番目のインスタンスが最初に占有していたメモリを再利用できるためです。 – chepner

1

技術的には、あなたの例はシングルトンではありません。シングルトンは、アプリケーション全体を通してアクセスされるクラスの一意のインスタンスです。 Pythonでは、シングルトンクラスは単一のインスタンスを1つしか構築できないクラスです。

しかし、クラスは、シングルトンオブジェクトとして使用する代わりにクラス自体を直接使用するため、シングルトンとして使用できます。

logger = my_singleton_class.logger() 

言語ごとに許可されているため、即時または重大な警告は表示されません。だからIMHOそれはPythonicかどうかではなく、味の問題です。

関連する問題