Задать вопрос
@WorthToLive

Как однозначно переопределить сложение?

Есть функция с одним основным аргументом и несколькими дополнительными. Дополнительные аргументы не обязательны, имеют свой собственный класс и нужны только для точной настройки функции. Пусть все дополнительные аргументы перечислены в этом списке [A, B, C, D]. А func(x) - функция.
Как сделать так, чтобы вместо записи func(x, A, B, D) можно было использовать func(x, A+B+D). В голову приходит простая идея переопределить сложение для класса дополнительных аргументов. Например, записывать названия аргументов с разделителем и передавать как строку A+B+D = "A$B" + D = "A$B$D", а дальше функция разберётся. Этот способ выглядит не очень элегантным. Хотелось бы узнать как в таких случаях делать правильно.
  • Вопрос задан
  • 128 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
  1. Нужно, чтобы классы A, B, C, D были потомками одного абстрактного класса Base. Абстрактный класс должен декларировать общий для них интерфейс.
  2. Нужно сделать ещё один класс G - потомок от Base. G должен содержать внутри список элементов класса Base. Кроме этого G должен реализовывать все абстрактные методы своего интерфейса путём вызова соответствующих методов вложенных в свой список объектов.
  3. Класс Base должен перекрывать метод сложения __add__. Результатом сложения возвращается экземпляр G, содержащий список из складываемых элементов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Andy_U
Я не понимаю, почему бы просто не сделать эти ваши доп.аргументы ключевыми и опциональными. Ну, примерно так:

from typing import Any, Optional


class A:
    def __init__(self, option: str):
        self._option = option

    def option(self) -> str:
        return self._option


class B:

    def __init__(self, option: int):
        self._option = option

    def option(self) -> int:
        return self._option


def func(x: Any, *, a: Optional[A] = None, b: Optional[B] = None) -> None:

    if a is not None:
        print(a.option())

    if b is not None:
        print(b.option())


if __name__ == '__main__':

    func(None, a=A('aaa'))
    func(None, b=B(666))
    func(None, a=A('AAA'), b=B(666))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы