Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python抽象类子类化_Python_Inheritance_Abstract Class - Fatal编程技术网

Python抽象类子类化

Python抽象类子类化,python,inheritance,abstract-class,Python,Inheritance,Abstract Class,我试图为python库的用户找到实现我编写的抽象类的最佳方法。 也就是说,我的抽象类定义了一个API来访问存储在数据库中的特定值,但是我想让用户选择如何存储它,比如简单的文本文件、json、sqlite等等 我的问题是,我应该如何检索用户创建的类并在我的库中使用它 这是我提出的解决方案,但我觉得它不太优雅,我想知道是否有一种更像蟒蛇的方式 在我的图书馆: from abc import ABC, abstractmethod class Database(ABC): @abstrac

我试图为python库的用户找到实现我编写的抽象类的最佳方法。 也就是说,我的抽象类定义了一个API来访问存储在数据库中的特定值,但是我想让用户选择如何存储它,比如简单的文本文件、json、sqlite等等

我的问题是,我应该如何检索用户创建的类并在我的库中使用它

这是我提出的解决方案,但我觉得它不太优雅,我想知道是否有一种更像蟒蛇的方式

在我的图书馆:

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非常令人惊讶。我希望至少能将类传递给库,而不是让它检测到它。如果我针对不同的场景有几个不同的实现呢?