2016-08-23 6 views
2

私は役に立つ情報をたくさんお伝えしました。http://www.phyast.pitt.edu/~micheles/python/metatype.htmlメタクラスの競合に陥ることなく、抽象クラスを実装するシングルトンクラスを作成するにはどうすればよいですか?

しかし、私はまだ答えを見つけられなかったと思います。したがって、新しい質問です。

私は社内で使用するための関数/クラスのライブラリを作成しています。その一環として、シングルトンクラスを作成したいと考えています。それ以外のクラスは継承してシングルトンになります。これらのクラスはサブクラスラブルでなければなりません。

PERはSO Creating a singleton in Pythonに投稿し、私が実装さ:

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 Singleton(_Singleton('SingletonMeta', (object,), {})): 
    pass 

それは動作します。サブクラス化できるシングルトンクラスを作成するのに役立ちます。

私のライブラリには、abcを使った抽象クラスを実装するいくつかのクラスがあります。そのようなクラスまたはこの抽象クラスを実装するクラスは、おそらくSingletonである可能性があります。

ので、

import abc 
class Foo(metaclass=abc.ABCMeta): 
    @abc.abstractmethod 
    def bar(self): pass 

class Bar(Singleton, Foo): # This generates the meta-class conflict 
    def bar(self): 
     return 'implemented' 
    def bat(self): 
     return 'something else' 

私はこのようなシナリオの実装を支援するための入力/助けを探しています。

**

概要要件:

**

  • シングルトンクラスを作成するためのメカニズム。
  • として実装されたクラスシングルトン(上記のメカニズムによる)は、サブクラスラブルである必要があります。サブクラス クラスmyには、基本クラスよりも新しい/新しいメソッドがあります。
  • 抽象クラスを作成するメカニズムです(abcはこれに役立ちます)。
  • シングルトンとして動作するこの抽象クラスの実装です。
    には、抽象クラスそのもの以外の追加のメソッドがある場合があります。

すべての入力/ヘルプ/ポインターに感謝します。

よろしく

シャラド

+0

要件が矛盾していると思われる場合は、その理由を考えてください。それは高く評価されます。 – Sharad

答えて

0

代わりに、あなたのシングルトンを登録するにはメタクラスに頼るのは、あなたの階層の基底クラスでそれを行うことができます - だけではなく、__new__方法でシングルトンロジックを置きます。そうすれば、ちょうどこの偽の行為のせいでメタクラスを変更する必要はなく、abc.metaclassesも機能します。

import abc 
class Foo(metaclass=abc.ABCMeta): 
    _singleton_registry = {} 
    def __new__(cls, *args, **kw): 
     if cls in in __class__._singleton_registry: 
      return __class__._singleton_registry[cls] 
     singleton = super().__new__(*args, **kw) 
     __class__._singleton_registry[cls] = singleton 
     return singleton 

    @abc.abstractmethod 
    def bar(self): pass 
関連する問題