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

By simon at 2018-02-07 • 0人收藏 • 22人看过

我正在尝试创建一个基本的抽象类和子类来抽象出来 访问后端数据库。一个子类将是SQLAlchemy和其他 MongoDB或其他nosql。以下是一个非常简单的例子。在基地 类我需要一个deleteObjec吨为每种类型的对象,因为noSQL 实现将需要这个,但是,任何使用SQLAlchemy只是 需要一个单身e删除方法。我想保存自己打字 遵循抽象基础中每种类型对象的方法。如果t他的工作 我不必为SQLAlchemy中的每个对象类型定义deleteObject 子类,因为基础抽象wi只要将它传递给private delete 功能。不幸的是,当我打电话给deleteUser的时候,它确实是抽象的 基本功能但对自我.删除(用户)的调用进入摘要 函数,即使子类定义了这个函数。有没有啊y来 确保抽象实现中的函数调用转到子类 子类定义了一个实现功能?

@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')

2 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

只是不要用.__delete中的两个__来命名你的方法 不管是“私人”的方式,不管错误领先的文档你 可能已经阅读 - 这只是导致方法的名称与类的冲突 名称在其中声明。所以,在一个子类上调用self.__delete会试图找到一个.__delete 该子类,只有在那里,永远不会调用在同样的方法上 超类 - 而反过来也是如此:如果你有这样的一个电话 抽象超类,子类方法从来没有被调用,因为内部 它们被重命名为包含类名称作为前缀。 只需使用一个_和事情应该开始工作,因为你的期望。

2018-02-07   #2

只是不要用.__delete中的两个__来命名你的方法 不管是“私人”的方式,不管错误领先的文档你 可能已经阅读 - 这只是导致方法的名称与类的冲突 名称在其中声明。所以,在一个子类上调用self.__delete会试图找到一个.__delete 该子类,只有在那里,永远不会调用在同样的方法上 超类 - 而反过来也是如此:如果你有这样的一个电话 抽象超类,子类方法从来没有被调用,因为内部 它们被重命名为包含类名称作为前缀。 只需使用一个_和事情应该开始工作,因为你的期望。

登录后方可回帖

Loading...