Основное использование наследования классов Python - PullRequest
2 голосов
/ 10 октября 2011

Я только начинаю работать с Python и пытаюсь найти правильный способ использования классов.

Моя программа в настоящее время имеет два класса, назовите их Planner и Model. Planner не зависит от модели, учитывая, что любой Model, который он использует, представляет согласованный интерфейс. Таким образом, создается впечатление, что если я хочу иметь несколько различных доступных моделей, все они должны наследовать от что-то , чтобы обеспечить согласованный интерфейс. Кроме того, некоторые классы Model будут иметь общие функциональные возможности. Например, модель singleAgent может имитировать одного агента, а модель doubleAgent - двух агентов, каждый из которых ведет себя так же, как singleAgent.

Итак - как мне реализовать эти / какие языковые функции мне нужны?

РЕДАКТИРОВАТЬ: Спасибо за быстрые ответы, выправляющие меня о уток уроки! Итак, похоже, что я бы использовал наследование, только если бы я хотел переопределить подмножество других функций Model? (А для моего doubleAgent я, вероятно, просто использовал бы singleAgents в качестве членов класса?)

Я просмотрел несколько других вопросов с похожими тегами, но они, кажется, больше связаны с синтаксисом, а не с выбором дизайна. Я также посмотрел официальную документацию Python по классам и не нашел того, что искал. (Возможно, потому что я не знаю достаточно, чтобы распознать это.)

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

В Python вы обычно не используете те же подходы к ООП, что и в статически типизированных языках. В частности, вам на самом деле не нужен объект для реализации определенного интерфейса или наследования от абстрактного базового класса и так далее. Скорее этот объект просто должен уметь делать необходимые операции. Это в разговорной речи известно как типирование утки. Если он ходит как утка и говорит как утка, то, по сути, это утка.

Так что просто решите, какие методы требуются для ваших объектов, и убедитесь, что они всегда есть. Если вы хотите разделить реализацию между различными участниками вашей системы, вы можете рассмотреть наследование классов. Но если нет, то вы можете также реализовать непересекающиеся иерархии классов.

2 голосов
/ 10 октября 2011

Одной из сильных сторон Python (и, как многие утверждают, слабых сторон) является то, что он не использует проверку типов во время компиляции для реализации интерфейсов.Это означает, что не требуется, чтобы набор объектов наследовал от общего базового класса, чтобы иметь тот же интерфейс - они все равно могут использоваться взаимозаменяемо в любой функции.Это поведение обычно известно как утка, печатающая .

На самом деле, поскольку Python динамически типизирован, вам будет трудно "обеспечить согласованный интерфейс", как вы сказали.По этой причине были созданы такие вещи, как zope.interface .Главное преимущество, которое вы получите от классов в вашем случае, - это повторное использование кода - если все типы Model реализуют какое-то общее поведение.

Чтобы сделать это еще на один шаг вперед, если у вас должен быть какой-то не связанный тип объекта всторонняя библиотека, находящаяся вне вашего контроля, которую вы хотите использовать в качестве Model, вы даже можете сделать то, что называется «патч обезьяны» или «штамповка утки» , чтобы добавить код, необходимый для предоставленияВаш Model интерфейс!

0 голосов
/ 10 октября 2011

В основном ссылка, которую вы указали на Classes in Python, отвечает на все ваши вопросы в разделе о наследовании.В вашем случае просто определите класс с именем Model, а затем два подкласса: singleAgent и doubleAgent.http://docs.python.org/library/abc.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...