我正在尝试创建一个基本抽象类和子类来抽象出对后端数据库的访问。一个子类是SQLAlchemy,另一个是MongoDB或其他nosql。以下是一个非常简单的例子。在基类中,我需要为每种类型的对象使用deleteObject,因为noSQL实现将需要这个,但是,使用SQLAlchemy的任何东西只需要一个delete方法。我想通过对抽象基础中的每种类型的对象使用以下方法来保存自己的输入。如果这样做,我就不必为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')
答案 0 :(得分:3)
请不要在__
中使用两个.__delete
来命名您的方法。这不适用于“私有”方法,无论您可能阅读过误导性文档 - 这只会导致方法名称被声明的类名称损坏。
因此,在子类上调用self.__delete
将尝试在该子类上找到.__delete
,并且只在那里找到,并且永远不会在超类上调用相同的方法 - 而且反过来也是true:如果您对抽象超类进行了这样的调用,则永远不会调用子类方法,因为在内部它们被重命名为包含类名作为前缀。
只需使用一个_
,事情应该按照您的预期开始工作。