我正在制作一个用于模拟简单电子电路的python程序,并且正在用kivy制作gui。允许我(或理论上是其他人)添加程序允许用于电路构建的新型组件(从基本组件类继承)的最佳实践是什么?将需要有一个类,该类具有用于作为电路一部分进行交互的方法和属性,并且需要一个基维文件或其他表示形式,以用于如何在gui中进行显示。
我的第一个想法是要拥有一个components文件夹,其中每个组件包含单独的文件夹,每个文件夹都具有用于该类的python文件和用于gui表示的kivy文件。但是,似乎没有一种基于文件名从文件中导入的好方法,而且看起来还是很混乱的。我想这种事情在可扩展程序中很常见,因此必须有一种更好的方法。任何帮助将不胜感激。
答案 0 :(得分:0)
这里是一个示例,其中我使用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
的其他参数
我不知道您对此有多少了解,对不起,如果其中有些有点光顾,但我希望这会有所帮助!
P.S。没有犯罪,史蒂芬·霍金。我们爱你。
答案 1 :(得分:0)
我过去做过类似的事情。第一步是找出共有的组件:
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子类化并实现其抽象方法来创建新组件。