2017-03-01 6 views
0

シングルトンパターンを使用して、クラスのインスタンス化の数を1つのオブジェクトに制限できるという印象を受けています。 obj3obj4が同じオブジェクトであることを証明しているベースクラスサブクラスシナリオのシングルトンパターン

class Singleton(type): 
    _instances = {} 
    def __call__(cls, *args, **kwargs): 
     if cls not in cls._instances: 
      cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 
     return cls._instances[cls] 

class base1(object): 
    __metaclass__ = Singleton 

class base2(base1): 
    pass 

class base3(base1): 
    pass 

class base4(base2): 
    pass   

obj1 = base4() 
obj2 = base4() 

print obj1 is obj2 #prints True 

obj3 = base3() 
obj4 = base3() 

print obj3 is obj4 #prints True 

print obj1 is obj3 #prints False 

まずprint文を印刷True:そして、心の中でそれを維持する、以下のコードを見てください。しかし、2番目の印刷ステートメントFalseobj1obj3が同じでないことを証明します。目標を達成するための最善の方法は、"Always return the same base1 object no matter which sub class instantiates it"です。

+0

なぜあなたもこれらのサブクラスを持っているでしょうか?あなたが本当にシングルトンを実行するメタクラスベースの施行ルートを通過したいのであれば、なぜこれらのサブクラスが存在することを許可していますか? – user2357112

+0

それは意味をなさない!それらのすべてがベースのオブジェクトのみを作成できるようにする必要がある場合、なぜ複数のクラスを作成するのですか?基本クラスのエイリアスが必要なのでしょうか?あなたのコードは、階層内の**クラスごとに1つのシングルトン**を可能にするように特別に作られています。なぜあなたは最初にそのようにプログラムしましたか? – Wombatz

答えて

-1

コードはhereからコピーされました。

あなたはterminalクラスを作成し、それを継承することはできません__metaclass__ので、他のクラスとしてそれを使用することができます。

class terminal(type): 
    def __init__(self, cl_name, bases, namespace): 
     for cls in bases: 
      if isinstance(cls, terminal): 
       raise TypeError("in "+cl_name+" definition : "+str(cls)+ 
           " can't be used as a base class") 
     super(terminal, self).__init__(cl_name, bases, namespace) 


# first we create a normal class 
class a(object): 
    pass 

#the terminal class: it can inherit from other classes but can't be 
#used as base class 
class b(a): 
    __metaclass__= terminal 

#this will fail because inheriting from b is forbidden 
class c(b): 
    pass 
+0

正確に「コンパイル」時間ですか?クラス作成は実行時に行われます。 – Wombatz

+0

@Wombatzコードのコメント - 修正済み。それ以外に、どうしてあなたはそれが良い答えではないと思いますか? – alfasin

関連する問題