Проектирование дочерних классов, наследующих функцию от родительского с небольшими различиями в параметрах (запросы API)Python

Программы на Python
Anonymous
Проектирование дочерних классов, наследующих функцию от родительского с небольшими различиями в параметрах (запросы API)

Сообщение Anonymous »

У меня есть общий родительский класс OMDManager, который обрабатывает общие функции, такие как get_api_assets(). Это позволяет мне сделать запрос на получение к API общим способом, передав любые необходимые мне параметры.

Код: Выделить всё

class OMDManager:

def __init__(self, omd_client: OpenMetadataClient):
self.omd_client = omd_client

def get_omd_assets(
self,
endpoint: str,
limit: int = 100,
params: Optional[Dict[str, Any]] = None
) -> list:
query_params = {"limit": limit}
if params:
query_params.update(params)
return self.omd_client.api_request_pages(endpoint=endpoint, params=query_params)
Мои дочерние классы на данный момент просто используют get_omd_assets() для получения ресурсов, например DashboardManager получает все информационные панели, а UserManager получает всех пользователей. На данный момент я просто вызываю get_omd_assets(), поскольку он передается из OMDManager, передавая соответствующие параметры, специфичные для панелей мониторинга или пользователей. Поэтому у них нет собственной реализации получения информационных панелей или пользователей.

Код: Выделить всё

class DashboardManager(OMDManager):

def function_for_db_manager():
do something ...

class UserManager(OMDManager):

def function_for_user_manager():
do something ...
Это означает, что когда я хочу получить информационные панели, я делаю что-то вроде этого

Код: Выделить всё

dashboards = db_manager.get_omd_assets(endpoint=endpoint, params={"service": myservice})
и для пользователей

Код: Выделить всё

users = user_manager.get_omd_assets(endpoint=endpoint, params={"isBot": "false"})
По моему мнению, благодаря этому классы становятся очень простыми. Однако интерфейс очень общий, каждый класс менеджера имеет только get_omd_assets, и вам нужно знать, какие параметры вы можете передать для конкретных конечных точек.
Мой вопрос о том, что лучше использовать. Оставьте все как есть, или мне следует сделать что-то вроде расширения функции get_omd_assets() в UserManager как get_users(), где функция принимает аргументы, такие как isBot ?

Код: Выделить всё

class UserManager(OMDManager):

def get_users(self, limit=100, is_bot=False):
params = {"isBot": is_bot, "limit": limit}
return self.get_omd_assets(endpoint="/users", params=params)
И если я это сделаю, как мне проводить тесты? Я уже тестировал get_omd_assets(), следует ли мне затем также реализовать тесты для get_users(), который по сути просто вызывает get_omd_assets() с конкретными аргументами?

Вернуться в «Python»