Дизайн класса Python - Разделение больших классов в несколько для группировки функциональности

Хорошо у меня есть 2 действительно больших класса> 1k строки каждый, что я в настоящее время разводился в несколько. Они затем повторно объединены с помощью множественного наследования. Теперь я задаюсь вопросом, если существует немного более чистое/лучше больше pythonic способа сделать это. Полностью факторизация их привела бы к бесконечным суммам self.otherself.do_something вызовы, которые я не думаю, являются способом, которым это должно быть сделано.

Чтобы ясно дать понять вещи, вот то, на что это в настоящее время похоже:

from gui_events import GUIEvents # event handlers
from gui_helpers import GUIHelpers # helper methods that don't directly modify the GUI

# GUI.py
class GUI(gtk.Window, GUIEvents, GUIHelpers):
    # general stuff here stuff here

Одной проблемой, которая является результатом этого, является жалоба Pylint, дающая мне, триллионы "init не названный" / "неопределенный атрибут" / "атрибут получили доступ перед определением" предупреждения.

Править:
Можно хотеть смотреть на код, сделать себя изображением о том, каково все это на самом деле.
http://github.com/BonsaiDen/Atarashii/tree/next/atarashii/usr/share/pyshared/atarashii/

Отметьте, я действительно пробую что-либо для хранения этой вещи как DRY как возможной, я использую pylint для обнаружения дублирования кода, единственной вещью, на которую это жалуется, является импорт.

15
задан Ivo Wetzel 24 March 2010 в 06:11
поделиться

4 ответа

Если вы хотите использовать множественное наследование, чтобы объединить все в один большой класс (это может иметь смысл), вы можете выполнить рефакторинг каждого родительского классы, так что каждый метод и свойство либо являются частными (начинается с « __ ]), либо имеют короткий префикс из 2–3 символов, уникальный для этого класса. Например, все методы и свойства в вашем классе GUIEvents могут начинаться с ge_ , все в GUIHelpers может начинаться с gh_ . Поступая так, вы добьетесь некоторой ясности при использовании отдельных экземпляров подкласса ( self.ge.doSomething () vs self.ge_doSomething () ) и вы » Я избегу противоречивых имен членов, что является основным риском при объединении таких больших классов в один.

8
ответ дан 1 December 2019 в 04:34
поделиться

Начните с поиска классов, которые моделируют концепции реального мира , с которыми ваше приложение должно работать. Это естественные кандидаты на учебу.

Старайтесь избегать множественного наследования насколько это возможно; это редко бывает полезно и всегда несколько сбивает с толку. Вместо этого попробуйте использовать функциональную композицию (отношения «HAS-A»), чтобы придать богатые атрибуты вашим объектам, состоящим из других объектов.

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

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

5
ответ дан 1 December 2019 в 04:34
поделиться

Я думаю, что это больше общий объектно-ориентированный дизайн проблема, чем проблема Python. Python в значительной степени предоставляет вам все классические инструменты ООП, удобно упакованные. Вам придется описать проблему более подробно (например, что содержат классы GUIEvents и GUIHelpers ?)

Один специфичный для Python аспект, который следует учитывать, заключается в следующем: Python поддерживает несколько парадигм программирования, и часто лучшим решением является не ООП. Это может иметь место здесь. Но опять же, вам придется добавить более подробную информацию, чтобы получить осмысленный ответ.

1
ответ дан 1 December 2019 в 04:34
поделиться

Ваш код может быть существенно улучшен за счет реализации дизайна Model-View-Controller. В зависимости от того, как настроен ваш графический интерфейс и инструмент, вы также можете извлечь выгоду из "виджетизации" частей вашего графического интерфейса, так что вместо одного огромного Model-View-Controller у вас есть главный Model-View-Controller, который управляет кучей меньших Model-View-Controller, каждый для отдельных частей вашего графического интерфейса. Это позволит вам разбить ваш инструмент и GUI на множество классов, и вы сможете повторно использовать их части, уменьшая общее количество кода, который вам нужно поддерживать.

Хотя python поддерживает несколько парадигм программирования, для инструментов GUI лучшим решением почти всегда будет объектно-ориентированный дизайн.

0
ответ дан 1 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: