允许以后添加新类的最佳实践?

时间:2019-01-20 14:56:33

标签: python python-import

我正在制作一个用于模拟简单电子电路的python程序,并且正在用kivy制作gui。允许我(或理论上是其他人)添加程序允许用于电路构建的新型组件(从基本组件类继承)的最佳实践是什么?将需要有一个类,该类具有用于作为电路一部分进行交互的方法和属性,并且需要一个基维文件或其他表示形式,以用于如何在gui中进行显示。

我的第一个想法是要拥有一个components文件夹,其中每个组件包含单独的文件夹,每个文件夹都具有用于该类的python文件和用于gui表示的kivy文件。但是,似乎没有一种基于文件名从文件中导入的好方法,而且看起来还是很混乱的。我想这种事情在可扩展程序中很常见,因此必须有一种更好的方法。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

这里是一个示例,其中我使用argskwargs使代码更加干燥。我制作了一个带有所有其他参数都可以继承的参数的基类。

因此所有组件都具有抵抗力,因此您可以将该抵抗力作为基类的参数,而不必在继承自它的其他类中重复。

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并使其继承一个PorcupineHedgehogCactus,所有这些都将具有PricklyMammal的默认参数和关键字参数:Mammal的默认参数和关键字参数,以及我添加到PricklyMammal的其他参数

我不知道您对此有多少了解,对不起,如果其中有些有点光顾,但我希望这会有所帮助!

P.S。没有犯罪,史蒂芬·霍金。我们爱你。

答案 1 :(得分:0)

我过去做过类似的事情。第一步是找出共有的组件:

  • 节点列表
  • 函数print_time_domain_analysis,该函数接收用于时域分析的电导矩阵,并返回使用组件参数更新的相同矩阵。
  • 用于其他类型分析的类似功能,例如print_frequency_domain_analysis
  • 对于您而言,这是一种在GUI上打印组件的方法。

您最终可能会遇到类似以下的情况:

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子类化并实现其抽象方法来创建新组件。