Лучшая практика для добавления новых классов позже? - PullRequest
0 голосов
/ 20 января 2019

Я делаю программу на Python для моделирования простых электронных схем, и я делаю графический интерфейс в киви. Какова была бы наилучшая практика, позволяющая мне (или теоретически кому-то еще) добавлять новые типы компонентов (которые наследуются от базового класса компонентов), которые программа позволит использовать при построении схем? Должен существовать класс с методами и свойствами для взаимодействия как части схемы, а также файл KIVY или какое-либо другое представление для отображения в графическом интерфейсе.

Моей первой мыслью было создать папку компонентов, которая содержала отдельные папки для каждого компонента, в каждой из которых был бы файл Python для класса и файл KIVY для представления графического интерфейса. Однако, кажется, нет хорошего способа импортировать из файла, основанного на его имени файла, и это все равно выглядит очень грязно. Я полагаю, что подобные вещи довольно распространены в расширяемых программах, поэтому должен быть лучший способ сделать это. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Я делал что-то подобное в прошлом. Первый шаг - выяснить, что общего у компонентов:

  • Список узлов
  • Функция print_time_domain_analysis, которая получает матрицу проводимости для анализа во временной области и возвращает ту же матрицу, обновленную с параметрами компонента.
  • Аналогичные функции для других типов анализа, например, print_frequency_domain_analysis.
  • В вашем случае, метод для печати компонента в вашем графическом интерфейсе.

Вы можете получить что-то вроде следующего:

from abc import ABC, abstractmethod

class TimeAnalysisComponent(ABC):

    def __init__(self, nodes):
        self.nodes = nodes
        super().__init__()

    @abstractmethod
    def print_time_domain_analysis(
        self,
        conductance_matrix,
        current_vector,
        delta_t):
        """
        Prints the component's parameters on a Conductance Matrix and on its
        Current Vector for time domain analysis
        """
        pass

    @abstractmethod
    def print_component_on_gui(self, gui_stuff):
        """
        Prints component on GUI.
        """
        pass

Тогда другие люди смогут создавать новые компоненты, подклассифицируя TimeAnalysisComponent и реализуя его абстрактные методы.

0 голосов
/ 20 января 2019

Вот пример, где я использую args и kwargs, чтобы сделать код намного более СУХИМ.Я создаю один базовый класс с параметрами, от которых могут наследоваться все остальные.

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

class Mammal(object):
    def __init__(self, genus, species, agility, *extra_args, **extra_kwargs):
        #extra is ignored as the subclasses handle them differently
        self.species = species
        self.genus = genus
        self.agility = agility

    def speak(self):
        print("Generic {0} making generic {0} sounds".format(self.genus + " " + self.species))

class Human(Mammal):
    def __init__(self, *args, **kwargs): #DRYer that re-listing the parameters
        super().__init__(*args, **kwargs) #Call init of Mammal
        self.intelligence = args[-1] #Uses args

class Hedgehog(Mammal):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.spikiness = kwargs["spikiness"] #Uses kwargs

stephen_hawking = Human("Homo", "Sapiens", 1, 100)
#100 is added to args and handled with self.intelligence = args[-1]
sanic = Hedgehog("Erinaceus", "Europaeus", (2 ** 63) - 1, spikiness = 10)

Итак, для человека я добавил дополнительный аргумент, специфичный для человеческого класса, интеллект.Он добавляется простым добавлением другого аргумента в инициализацию и обработкой его в Human.__init__.Для ежа я добавил дополнительный аргумент ключевого слова, который обрабатывается путем получения значения ключа spikiness.Оба из них могут быть использованы в сочетании.Если бы я хотел, я мог бы вместо этого создать класс PricklyMammal с добавлением spikiness и сделать наследниками Porcupine, Hedgehog и Cactus, все из которых будут иметь аргументы по умолчанию и аргументы ключевых слов PricklyMammal: Те из Mammal и дополнительные, которые я добавил к PricklyMammal

Я не знаю, сколько вы знаете об этом, извините, если что-то из этого было немного покровительственно, но я надеюсь, чтоэто помогает!

PS Без обид, Стивен Хокинг.Мы любим тебя.

...