2017-11-27 20 views
0

私が書いた抽象クラスを実装するために、私のPythonライブラリのユーザーにとって最善を尽くそうとしています。 つまり、私の抽象クラスは、データベースに格納された特定の値にアクセスするためのAPIを定義しますが、ユーザーに保存方法(単純なテキストファイル、json、sqliteなど)を選択させたいとします。Python - 抽象クラスのサブクラス化

ユーザーが作成したクラスをライブラリから取得する方法はありますか。

これは私が思いついた解決策ですが、私はそれは非常に優雅ではないと思うし、より無作法な方法があるのだろうかと思います。マイライブラリに

:ユーザーコードもちろん

class SqliteDatabase(Database): 

    def get(self, index): 
     # sqlite SELECT and such 
     return data 

    def insert(self, data): 
     # sqlite INSERT INTO 
     # return data with index provided 
     return data 

from abc import ABC, abstractmethod 

class Database(ABC): 

    @abstractmethod 
    def get(self, index): 
     pass 

    @abstractmethod 
    def insert(self, data): 
     pass 

def get_database(): 
    """call this anywhere I need a concrete database class""" 
    return Database.__subclasses__()[-1] 

、定義されたサブクラスが存在しない場合、私はIndexErrorよりも優れたエラーを返しますが、あなたのアイデアを得ます。

ありがとうございます!私は最終的に何か他のもののために定住

+0

少し詳しく説明できますか?問題はどこだ? – James

+0

なぜあなたはそのようなクラスを取得していますか?クライアントがそのサブクラスのインスタンスを渡すべきではありませんか? – Blorgbeard

+0

@Jamesそれ自体は問題ありません。すべてが現在の状態で動作します。私は、これを行うより良い方法があるかどうかを知りたいだけです。 – galactics

答えて

0

Blorgbeardは

_databases = {} 

def register(dbname="default"): 
    def wrapper(klass): 
     _databases[dbname] = klass 
     return klass 
    return wrapper 

def get_db(name="default"): 
    return _databases[name] 

を提案し、ユーザーが唯一の

@register() 
class SqliteDatabase: 

    def __get__(self, index): 
     # retrieve data 
     if data is None: 
      raise KeyError(index) 
     return data 

をこのように宣言する必要があるように、誰もが彼らが望むようデータベース限り多くを宣言することができます。 このバージョンを上回る改善がなされた場合、私は喜んでそれらを取ります。

関連する問題