2012-04-15 4 views
2

Я пытаюсь подобрать Python для проекта, и я немного смущен тем, как использовать абстракции и классы. (Я не очень опытный программист, поэтому извиняюсь за базовый уровень этого вопроса.) Я исхожу из фона Java/Ocaml, и то, что я пытаюсь сделать, выглядит следующим образом: у меня есть абстрактные классы для графика и graphadvanced (график с некоторыми более причудливыми методами), которые выглядят что-то вроде этогоАбстракция в Python?

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* 

Другими словами, как я могу определить методы Advanced отвлеченно с точки зрения методов AbstractGraph, а затем каким-то образом передать Graph в конструктор, чтобы получить экземпляр Advanced, который использует определения Advanced с реализацией графа?

Что касается Ocaml, я пытаюсь рассматривать AbstractAdvanced и AbstractGraph как типы модулей, но я немного поиграл с python, и я не уверен, как заставить это работать.

+1

исправить форматирование, нажмите 'code' вкладку, когда вы редактирование – Shep

+2

В python обычно нет необходимости в таких вещах. Просто напишите фактический код. – georg

+0

Как я понимаю, python не использует строгую концепцию интерфейсов и typechecks, например, например. Ява. Через Duck-Typing это не имеет смысла. Поэтому вы просто это делаете. Cou может принудительно выполнить его с помощью isinstance() вызывает ваш параметр, но это не даст вам статического ввода, к которому вы привыкли. Python - динамически типизированный язык. – sleeplessnerd

ответ

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 
+0

Я предполагаю, что я хотел бы иметь возможность потенциально передавать в разных реализациях графа, которые имеют одинаковые имена методов, без необходимости переписывать по существу одинаковый код каждый раз. Нет ли способа сделать это? – Tony

+1

@Tony Да, есть, как я объяснил: вы наследуете от этих классов. – Marcin

+1

@ Тони: действительно, вам не придется переписывать любые строки «фактического кода». Наследование класса «Graph» получило бы все эти методы для вас. –

Смежные вопросы