Два Python (3) класса с одинаковыми входными данными (расширение класса Python) - PullRequest
0 голосов
/ 31 мая 2018

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

class Create:
# Functions to manipulate Index Objects

def __init__(self, index, type, host, shards=3, replicas=1):
# Create Index Object (OcrBook or OcrPage)
    self.index = index
    self.type = type
    self.shards = shards
    self.replicas = replicas
    self.es_connection = Elasticsearch([{'host': host, 'port': 9200}])

С этим классом связаны функции для манипулирования объектами индекса, например, для создания этого индекса (таблицы) в базе данных (кластере) или изменения этой таблицы каким-либо образом.

def create_index(self):
# Creates/Executes Index
    try:
        self.es_connection.indices.create(
            index=self.index,
            body={
                'settings' : {
                    'number_of_shards' : self.shards,
                    'number_of_replicas': self.replicas,
                }
            })
    except Exception:
        CreateLog.write_log(Exception, 'Create Index Exception')

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

class Search(Create):

    def find_book(self, bookkey):
        """  Finds a Book """
        try:
            results = self.es_connection.search(self.index, self.type, body={
                "query": {
                    "match": {
                        "BookKey": bookkey
                    }
                }
            })
            return results['hits']['hits']

        except Exception:
            CreateLog.write_log(Exception, 'Could Not Find Book')

Это работает в Windows, но не переносится на 'linux', так как 'класс не был инициализирован', когда я пытаюсь использовать функцию поиска,Я знаю, что здесь есть проблема дизайна, и я мог бы объединить оба класса в один, чтобы решить проблему.Но я хотел бы держать их отдельно.Есть ли лучший способ «унаследовать» (я не верю, что это правильное слово в данном случае) объект, созданный в классе «Создать» классом поиска, у кого-нибудь есть лучший способ их логически разделить илиЕсть ли лучший способ расширить класс создания с помощью функции поиска?Весь вклад полезен!Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Вы, кажется, находитесь на пути ООП, но почему именно Поиск должен быть классом?У вас есть идеальное задание для автономной функции find_book(index_object, bookkey).Он ничего не хранит внутри, я не понимаю, почему это должно быть классом, а не функцией.

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

В ваших настройках я бы выбрал класс IndexObjects (то есть Create переименованный) и функцию find_book(index_object, bookkey).Вы можете перейти к большему количеству ООП после того, как этот дизайн заработает

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

class IndexObject:

#    ...

    def query(self, query_dict):
        return self.es_connection.search(self.index, self.type, body=query_dict)       


class BookSearcher():    
    def __init__(self, index_object):
        self.index_object = index_object

    def find(self, book_key):
        """  Finds a Book """
        query_dict = {"query": {
                    "match": {
                        "BookKey": book_key
                    }
                  }
                }        
        try:
            results = self.index_object.query(query_dict)
            return results['hits']['hits']        

        # FIXME: looks lile bare exception, not great
        except Exception:
            CreateLog.write_log(Exception, 'Could Not Find Book')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...