我正在尝试为项目选择Python,我对如何使用抽象和类感到困惑。 (我不是一个非常有经验的程序员,所以对这个问题的基本级别表示道歉。)我来自Java / Ocaml背景,我一直在尝试做的事情如下:我有一个图的抽象类和一个graphadvanced(一个图表与一些更花哨的方法),看起来像这样
class AbstractGraph:
def method1(self):
raise NotImplementedError
...
class AbstractAdvanced:
def method2(self):
raise NotImplementedError
...
然后我有一个图表的实现:
class Graph(AbstractGraph):
def method1(self):
* actual code *
现在我的问题是:我可以这样做吗?
class Advanced(AbstractAdvanced, AbstractGraph):
def method2(self):
*actual code, using the methods from AbstractGraph*
换句话说,如何根据AbstractGraph的方法抽象地定义Advanced方法,然后以某种方式将Graph传递给构造函数以获取Advanced的实例,该实例使用Advanced的定义和Graph的实现?
就Ocaml而言,我正在尝试将AbstractAdvanced和AbstractGraph视为模块类型,但我已经使用python玩了一下,我不知道如何让它工作。
答案 0 :(得分:1)
如果要创建抽象基类,则可以,但它们的实用性有限。使用具体类启动类层次结构(在继承自object或其他第三方类之后)更为正常。
如果你想创建一个将各种类的某些协议组合在一起的类,那么只需继承你的实现类:
#Always inherit from object, or some subtype thereof, unless you want your code to behave differently in python 2 and python 3
class AbstractGraph(object):
def method1(self):
raise NotImplementedError
class Graph(AbstractGraph):
def method1(self):
* actual code *
class GraphToo(AbstractGraph):
def method1(self):
* actual code *
class AbstractAdvanced(AbstractGraph):
def method2(self):
raise NotImplementedError
class Advanced(Graph,AbstractAdvanced):
def method2(self):
*actual code, using the methods from Graph*
# order of classes in the inheritance list matters - it will affect the method resolution order
class AdvancedToo(GraphToo, Advanced): pass