Хорошо у меня есть 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 для обнаружения дублирования кода, единственной вещью, на которую это жалуется, является импорт.
Если вы хотите использовать множественное наследование, чтобы объединить все в один большой класс (это может иметь смысл), вы можете выполнить рефакторинг каждого родительского классы, так что каждый метод и свойство либо являются частными (начинается с « __
]), либо имеют короткий префикс из 2–3 символов, уникальный для этого класса. Например, все методы и свойства в вашем классе GUIEvents
могут начинаться с ge_
, все в GUIHelpers
может начинаться с gh_
. Поступая так, вы добьетесь некоторой ясности при использовании отдельных экземпляров подкласса ( self.ge.doSomething ()
vs self.ge_doSomething ()
) и вы » Я избегу противоречивых имен членов, что является основным риском при объединении таких больших классов в один.
Начните с поиска классов, которые моделируют концепции реального мира , с которыми ваше приложение должно работать. Это естественные кандидаты на учебу.
Старайтесь избегать множественного наследования насколько это возможно; это редко бывает полезно и всегда несколько сбивает с толку. Вместо этого попробуйте использовать функциональную композицию (отношения «HAS-A»), чтобы придать богатые атрибуты вашим объектам, состоящим из других объектов.
Не забудьте сделать так, чтобы каждый метод выполнял одну маленькую конкретную вещь ; это обязательно влечет за собой разбиение методов, которые делают слишком много вещей, на более мелкие части.
Выполните рефакторинг случаев, когда вы обнаруживаете, что множество таких методов дублируют функции друг друга; это еще один способ найти естественные совокупности функциональных возможностей, которые заслуживают того, чтобы относиться к отдельному классу.
Я думаю, что это больше общий объектно-ориентированный дизайн проблема, чем проблема Python. Python в значительной степени предоставляет вам все классические инструменты ООП, удобно упакованные. Вам придется описать проблему более подробно (например, что содержат классы GUIEvents
и GUIHelpers
?)
Один специфичный для Python аспект, который следует учитывать, заключается в следующем: Python поддерживает несколько парадигм программирования, и часто лучшим решением является не ООП. Это может иметь место здесь. Но опять же, вам придется добавить более подробную информацию, чтобы получить осмысленный ответ.
Ваш код может быть существенно улучшен за счет реализации дизайна Model-View-Controller. В зависимости от того, как настроен ваш графический интерфейс и инструмент, вы также можете извлечь выгоду из "виджетизации" частей вашего графического интерфейса, так что вместо одного огромного Model-View-Controller у вас есть главный Model-View-Controller, который управляет кучей меньших Model-View-Controller, каждый для отдельных частей вашего графического интерфейса. Это позволит вам разбить ваш инструмент и GUI на множество классов, и вы сможете повторно использовать их части, уменьшая общее количество кода, который вам нужно поддерживать.
Хотя python поддерживает несколько парадигм программирования, для инструментов GUI лучшим решением почти всегда будет объектно-ориентированный дизайн.