Есть ли причина использовать классы в Python, если в программе только один класс? - PullRequest
8 голосов
/ 21 октября 2010

Я видел, как некоторые люди писали код на Python, создав один класс, а затем объект для вызова всех методов.Есть ли преимущество использования классов, если мы не используем наследование, инкапсуляцию и т. Д.?Такой код кажется мне менее чистым со всеми этими «я» аргументами, которых мы могли бы избежать.Является ли эта практика влиянием других языков программирования, таких как Java, или есть веская причина, почему программы на Python должны быть структурированы следующим образом?

пример кода:

class App:

# all the methods go here

a = App()    

Ответы [ 5 ]

7 голосов
/ 21 октября 2010

Одно преимущество, хотя и не всегда применимое, состоит в том, что оно позволяет легко расширять программу путем создания подкласса одного класса.Например, я могу создать его подкласс и переопределить метод, который читает, скажем, из csv-файла, для чтения XML-файла, а затем создать экземпляр подкласса или исходного класса на основе информации времени выполнения.Оттуда логика программы может продолжаться нормально.

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

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

4 голосов
/ 21 октября 2010

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

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

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

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

И последнее, но не менее важное: некоторые люди будут возражать против всего, на что они попадают,или не сможет прочитать.Я один из них:)

3 голосов
/ 21 октября 2010

1.Я знаю одно использование для этого.

Хотя это может быть достигнуто другими способами.Это гарантирует, что оба модуля - module_B и module_C используют один и тот же экземпляр App и не создают экземпляры отдельных объектов.

In module_A.py

class App:
   ....

a = App()

In module_B.py

from module_A import a

В module_C.py

from module_A import a

Конечно, вы можете создавать отдельные объекты, но это не является целью вышеупомянутых модулей.

Что если вы сделали следующее в module_D.py

from module_A import App
a = App()

2.[Pedantic]

Вы можете избежать использования классов и декомпозировать свое решение, используя только модули и функции.Но разве это не будет выглядеть ужасно в большой программе?Не хотите ли вы использовать объектно-ориентированную парадигму в вашей программе?Все языки предоставляют определенный способ воспользоваться преимуществами ОО.Нам всем нравится какая-то вещь или другая, а некоторые действительно выключают нас.Явное лучше, чем неявное, обычно это путь Python.Хотя это недостаточно веская причина для включения.

2 голосов
/ 21 октября 2010

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

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

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

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

Но я всего лишь один парень, и программирование - не моя основная работа.

1 голос
/ 21 октября 2010

Есть ли преимущество использования классов, если мы не используем наследование, инкапсуляцию и т. Д.?

Да.

эта практика под влиянием других языков программирования, таких как Java

Количество

Есть ли веская причина, почему программы на Python должны иметь такую ​​структуру?

Да.

Тем не менее. Исходя из вашего вопроса, вы четко решили, что «Такой код кажется мне менее чистым со всеми этими« я »аргументами».

Нет особого смысла объяснять преимущества объявления класса, если вы уже уверены, что оно "менее чисто".

Учтите это.

  1. Скрипт никогда не бывает статичным.
  2. Нужно изменить бесклассовый дизайн.
  3. В какой-то момент изменения приведут ко второму классу.

Нижняя линия.

Вы можете работать без класса в течение коротких моментов. Пока вы не внесете изменения. Тогда вы пожалеете, что у вас не было слова class и всех этих «нечистых» аргументов.

Вы добавите их в конце концов.

Зачем ждать?

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