Python抽象类子类化
我试图为python库的用户找到实现我编写的抽象类的最佳方法。 也就是说,我的抽象类定义了一个API来访问存储在数据库中的特定值,但是我想让用户选择如何存储它,比如简单的文本文件、json、sqlite等等 我的问题是,我应该如何检索用户创建的类并在我的库中使用它 这是我提出的解决方案,但我觉得它不太优雅,我想知道是否有一种更像蟒蛇的方式 在我的图书馆:Python抽象类子类化,python,inheritance,abstract-class,Python,Inheritance,Abstract Class,我试图为python库的用户找到实现我编写的抽象类的最佳方法。 也就是说,我的抽象类定义了一个API来访问存储在数据库中的特定值,但是我想让用户选择如何存储它,比如简单的文本文件、json、sqlite等等 我的问题是,我应该如何检索用户创建的类并在我的库中使用它 这是我提出的解决方案,但我觉得它不太优雅,我想知道是否有一种更像蟒蛇的方式 在我的图书馆: from abc import ABC, abstractmethod class Database(ABC): @abstrac
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]
在用户代码中
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
当然,如果没有定义子类,我将返回一个比IndexError更好的错误,但是您明白了
提前谢谢你 正如布罗格比尔德所建议的那样,我最终决定做点别的事情
_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
这样,任何人都可以声明任意多个数据库。
如果您对这个版本有改进,我很乐意接受。您能再详细说明一下吗?问题出在哪里?为什么要这样检索类?客户端不应该传入其子类的实例吗?@James本身没有问题,因为一切都在当前状态下工作。我只是想知道是否有更好的方法来做到这一点。@Blorgbeard他们可以,但如果可以避免的话,我宁愿不要依赖注入。一个简单的子类应该足够了,而且我的库会做的是LoWorki不会调用自己的Python,但是我会认为这个API非常令人惊讶。我希望至少能将类传递给库,而不是让它检测到它。如果我针对不同的场景有几个不同的实现呢?