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