2016-09-27 10 views
1

シングルトンの基底クラスを持っていますが、別のクラスで継承する必要がありますが、エラーメッセージが表示されます TypeError:メタクラスベースを呼び出すときにエラーが発生しました function()コードでなければなりません。継承する方法Pythonでシングルトンを持つ基底クラス

誰か助けてもらえますか? 以下はサンプルコードです。

def singleton(cls): 
    instances = {} 
    def getinstance(): 
    if cls not in instances: 
     instances[cls] = cls() 
    return instances[cls] 
    return getinstance 

@singleton 
class ClassOne(object): 

    def methodOne(self): 
    print "Method One" 

    def methodTwo(self): 
    print "Method Two" 


class ClassTwo(ClassOne): 
    pass 
+0

私はあなたが設計上の問題を起こしたと思う...シングルトンとは、派生クラスを持っていれば、基本クラスの複数の(2)インスタンスを持つことになります。シングルトンが必要ですか? –

+0

'' locals() 'はうまくいきませんか? – dsgdfg

+0

必要はClassOneであり、ClassTwoはどちらもシングルトンですが、classOneはClassTwoの機能を持ち、サポートはほとんどないため、ClassTwoではなくclassOneメソッドを使用する必要があります。すべてoverこれらをchangingことmajor changeがhence私この@singleton like changesを作っinheritance – santosh

答えて

1

singletonは、派生させる関数の代わりにクラスを作成する必要があります。ここではPython 2.7と3.5の両方でテストされている例です。

class singleton(object): 
    instances = {} 
    def __new__(cls, clz = None): 
     if clz is None: 
      # print ("Creating object for", cls) 
      if not cls.__name__ in singleton.instances: 
       singleton.instances[cls.__name__] = \ 
        object.__new__(cls) 
      return singleton.instances[cls.__name__] 
     # print (cls.__name__, "creating", clz.__name__) 
     singleton.instances[clz.__name__] = clz() 
     singleton.first = clz 
     return type(clz.__name__, (singleton,), dict(clz.__dict__)) 

あなたはあなたの例のクラスでこれを使用する場合:

@singleton 
class ClassOne(object): 

    def methodOne(self): 
    print "Method One" 

    def methodTwo(self): 
    print "Method Two" 


class ClassTwo(ClassOne): 
    pass 

クラスAB両方シングルトン

になります注意してください、シングルトンクラスから継承することは珍しいことです。

+0

ありがとう – santosh

関連する問題