Python中的抽象?

时间:2012-04-15 15:06:35

标签: python inheritance abstract-class

我正在尝试为项目选择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玩了一下,我不知道如何让它工作。

1 个答案:

答案 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