OOP in python: как заставить метод вызываться как instance.method.variant () - PullRequest
1 голос
/ 28 апреля 2020

Я новичок в Python и особенно я неопытен в OOP.

Я работаю над графическим инструментом для сом-файлов в python для некоторых данных для преобразователя энергии.

Я постараюсь объяснить свой вопрос, не вдаваясь в подробности.

На данный момент я создал класс с именем Plotter и метод plot_by_name ().

В plot_by_name () я могу ввести все имена, которые включены в словарь, это может например быть ['UL1', 'UL2', 'UL3']. Теперь я хотел бы создать несколько специальных методов, которые используют plot_by_name () для наиболее частых комбинаций, поэтому вместо необходимости вводить следующее:

ratehigh1 = Plotter(dictionary)
ratehigh1.plot_by_name(['UL1', 'UL2', 'UL3'])

Пользователь может просто ввести:

ratehigh1 = Plotter(dictionary)
ratehigh1.plot_by_template.UL()

И, кроме того, я представляю, что пользователь может получить предложения от своей IDE для этих частых комбинаций. Я надеюсь, что эта часть объясняет, почему это было бы удобно, чтобы пользователю не приходилось вспоминать каждое конкретное c имя, а вместо этого просто выбирать предложения.

Поэтому мой вопрос заключается в том, возможно ли получить структуру класса, чтобы пользователь мог вызвать instance.plot_by_template.combination ()? - Какая будет комбинация для plot_by_template? (подкласс, метод или что-то еще)

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Конкретный синтаксис instance.method.variant() не является идиоматическим c в Python. Тем не менее, вы можете выполнить sh то, что вы хотите, более идиоматически c, используя константы класса:

class Plotter:

    PLOT_TEMPLATES = {
         "UL": ['UL1', 'UL2', 'UL3'],
         "OTHER": ['some', 'other', 'thing']
    }

    def plot_by_name(self, name):
        // ... Your Code Here ...

    def plot_by_template(self, template):
        if template not in self.PLOT_TEMPLATES:
            raise RuntimeException(f"Plotting template not found: {template}")
        self.plot_by_name(PLOT_TEMPLATES[template])

В качестве альтернативы, при условии, что существует только небольшое количество возможных шаблонов, которые все известны статически хороший способ сделать это просто реализовать различные методы для каждого шаблона. Это также имеет то преимущество, что вы предлагаете пользователю предложения в IDE (в большинстве IDE), которые вы хотели. Как то так:

class Plotter:

    def plot_by_name(self, name):
        // ... Your Code Here ...

    def plot_by_template_UL(self):
        self.plot_by_name(['UL1', 'UL2', 'UL3'])

    def plot_by_template_OTHER(self):
        self.plot_by_name(['some', 'other', 'thing'])


0 голосов
/ 28 апреля 2020

В Python это невозможно, как ты пишешь. Вы не можете вызывать функцию внутри функции извне. Но вы можете использовать шаблон с re (например, plot_by_name("UL")).

...