4

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

4

1 回答 1

1

如果你想创建抽象基类,你可以,但它们的用处有限。用具体的类开始你的类层次结构(从对象或其他第三方类继承之后)更正常。

如果您想创建一个将部分协议的各种类组合在一起的类,那么只需从您的实现类继承:

#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
于 2012-04-15T15:19:56.443 回答