2016-10-11 4 views
1

Итак, я сейчас разрабатываю простой веб-скребок в Python, но у меня возник вопрос о том, как структурировать свой код. На других языках программирования (особенно скомпилированных языках, таких как C++ и C#) у меня была привычка обертывать все мои функции в классах. То есть в моем примере веб-очистки я мог бы иметь класс, называемый как-то вроде «WebScraper», а затем удерживать все функции внутри этого класса. Я мог бы даже зайти так далеко, чтобы создать второй вспомогательный класс, например «WebScraperManager», если мне нужно создать несколько экземпляров исходного класса «WebScraper».Является ли это «Python-esque», чтобы обернуть все функции в классе?

Это приводит меня к моему текущему вопросу. Совместимая логика в текущем примере? Или я просто определяю файл WebScraper.py без класса оболочки внутри этого файла, а затем просто импортирую функции, поскольку мне они нужны, в какой-то файл main.py?

+1

Это зависит, если вы хотите больше использовать свой «WebScraper» в будущем, тогда создайте класс, если вам понадобятся случайные функции, тогда сделайте это. Вы также можете использовать 'classmethod', чтобы не создавать экземпляры экземпляров. –

+1

Как и во многих вариантах дизайна, ответ не может быть намного более объективным, чем «он зависит». Я бы назвал [этот вопрос SO для некоторого дополнительного чтения] (http://stackoverflow.com/q/3039889/). –

ответ

2

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

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

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

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

Редактировать: только для того, чтобы закрыть цикл и прийти к исходному вопросу: Нет, я бы сказал, что это не pythonesque, чтобы обернуть все функции в классах. Свободные функции просто хороши в python, все зависит от того, что подходит. Кроме того, термин pythonesque не очень pythonic ;-)

1

Вы имеете в виду «pythonic».

Это зависит от того, насколько объектно-ориентированный, масштабируемый ... вам нужна ваша реализация. Я бы использовал класс над простыми функциями. Давайте завтра скажем, что вы хотите CraiglistScrapper и FacebookScrapper ... Я бы создал абстрактный класс «Scrapper», а затем два выше наследовал от этого и переопределял то, что вам нужно (полиморфизм). Я имею в виду, что объектно-ориентированные принципы и шаблоны не зависят от языка. Теперь я не буду «держать все функции» в классе (принцип единой ответственности), каждый раз, когда вы код запоминаете это слово «SOLID».

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

  • Нет связанных вопросов^_^