Я - самообучающийся объектно-ориентированный Python и у меня есть классический вопрос "наследуй или сочиняй" в моем проекте. Я прочитал многие общие рекомендации / ответы на этот вопрос, но мне сложно применить это в моем конкретном случае - поэтому я решил спросить.
Моя программа - это веб-скребок, который очищает веб-сайт с различными типами страниц (и разными объектами данных на этих страницах). Я использую BeautifulSoup (bs4) для анализа данных из необработанного ответа на запрос. Поскольку требуется много различных объектов данных, мне нужно около 10 различных функций синтаксического анализа.
Мой вопрос - какая архитектура лучше всего подойдет для объекта-парсера?
A: Создайте класс mySoup, унаследованный от BeautifulSoup, и добавьте функции синтаксического анализа как методы.
B: самостоятельно создать класс Parser, который принимает в качестве аргумента объект BeautifulSoup.
Я уже двинулся вперёд между этими двумя решениями, и мое личное мнение состоит в том, что я бы предпочел выбрать Inheritance-Solution просто потому, что он делает вызов синтаксического анализатора чистым и простым. Также «Parser» не выглядит для меня как необходимый объект, а скорее как набор функций.
class mySoup(BeautifulSoup):
def parseData1(self):
data = self.find('foo', {'class':'bar'}).text
return data
def parseData2(self):
...
return data
soup = mySoup(page_source)
data = soup.parseData1()
против
class Parser():
def __init__(self,soup):
self.soup=soup
def parseData1(self):
data = self.soup.find('foo', {'class':'bar'}).text
return data
def parseData2(self):
...
return data
soup = BeautifulSoup(page_source)
data = Parser(soup).parseData1()