Python,从抽象基调用子类方法

Mat*_*key 0 python abstract-class python-3.x

我正在尝试创建一个基本抽象类和子类来抽象对后端数据库的访问。一个子类是 SQLAlchemy,另一个子类是 MongoDB 或其他 nosql。下面是一个非常简单的例子。在基类中,我需要为每种类型的对象提供一个 deleteObject,因为 noSQL 实现将需要这个,但是,任何使用 SQLAlchemy 的内容都只需要一个删除方法。我想通过为抽象基础中的每种类型的对象提供以下方法来节省自己的打字时间。如果这有效,我就不必为 SQLAlchemy 子类中的每个对象类型定义 deleteObject,因为基本抽象只会将其传递给私有 __delete 函数。不幸的是,当我调用deleteUser时,它确实会转到抽象基函数,但对self.__delete(user)的调用会转到抽象函数,即使子类定义了此函数。当子类定义该函数的实现时,有没有办法确保抽象实现中的函数调用转到子类?

@abc.abstractmethod
def deleteUser(self, user):
    """Delete an user from the backend database"""
    print('abstractmethod')
    self.__delete(user)

@abc.abstractmethod
def __delete(self, object):
    print('dont go here')
Run Code Online (Sandbox Code Playgroud)

jsb*_*eno 5

只是不要__像 中那样用两个来命名你的方法.__delete。这不适用于“私有”方法,无论您可能阅读过哪些误导性文档 - 这只会导致方法名称与其声明的类名称混淆。

因此,对子self.__delete类的调用将尝试在该子类上找到 a .__delete,并且仅在那里,并且永远不会在超类上调用相同的方法 - 反之亦然:如果 a 您对抽象超类有这样的调用,子类方法永远不会被调用,因为它们在内部被重命名以包含类名作为前缀。

只需使用一个_,事情就会开始按您的预期工作。