Seite 1 von 1

Universelle Schnittstelle für Labornetzteile: ich steh gerade auf dem Schlauch

Verfasst: Mittwoch 8. Juni 2022, 17:44
von burli
Hi, ich habe gerade einen Blackout und benötige eine kleine Erleuchtung.

Ich möchte eine generische API für Labornetzteile programmieren. Also sowas wie pwr.set_voltage(), pwr.get_current() usw. Das soll für alle Netzteile gleich sein.

Allerdings können sich die Protokolle unterscheiden und auch die Hardwareschnittstelle kann von RS232 bis Ethernet reichen.

Ich stehe gerade komplett auf dem Schlauch, wie man das in Python macht. In Rust würde ich vermutlich ein Trait verwenden und für jedes Netzteil eine eigene Implementierung. Aber für Python fehlen mir gerade die passenden Suchbegriffe.

Re: Universelle Schnittstelle für Labornetzteile: ich steh gerade auf dem Schlauch

Verfasst: Mittwoch 8. Juni 2022, 17:52
von __blackjack__
@burli: In Python denkst Du Dir das/den Trait falls es keine Funktionskörper enthält einfach und schreibst für jedes Netzteil eine eigene Implementierung. Ansonsten halt eine (abstrakte) Basisklasse und dann für jedes Netzteil eine Implementierung.

Re: Universelle Schnittstelle für Labornetzteile: ich steh gerade auf dem Schlauch

Verfasst: Mittwoch 8. Juni 2022, 18:01
von burli
Eigentlich hast du Recht, ich kann ja einfach jedes Netzteil mit import xyz as pwr importieren. Eigentlich bin ich doof :Facepalm:

Ich danke dir für das Licht im Dunkel

Re: Universelle Schnittstelle für Labornetzteile: ich steh gerade auf dem Schlauch

Verfasst: Mittwoch 8. Juni 2022, 18:15
von __blackjack__
Traits sind nicht ganz das gleiche wie Klassen, weil man bei Klassen in der Regel nur von einer Basisklasse erbt, aber das Beispiel aus Rust by Example https://doc.rust-lang.org/rust-by-example/trait.html kann man im Python in etwa so umsetzen:

Code: Alles auswählen

#!/usr/bin/env python3


class Animal:
    def __init__(self, name, is_naked=False):
        self.name = name
        self.is_naked = is_naked

    @property
    def noise(self):
        raise NotImplementedError

    def talk(self):
        print(f"{self.name} says {self.noise}")


class Sheep(Animal):
    @property
    def noise(self):
        return "baaaaah" + ("?" if self.is_naked else "!")

    def talk(self):
        print(f"{self.name} pauses briefly... {self.noise}")

    def shear(self):
        if self.is_naked:
            print(f"{self.name} is already naked...")
        else:
            print(f"{self.name} gets a haircut!")
            self.is_naked = True


def main():
    dolly = Sheep("Dolly")
    dolly.talk()
    dolly.shear()
    dolly.talk()


if __name__ == "__main__":
    main()

Re: Universelle Schnittstelle für Labornetzteile: ich steh gerade auf dem Schlauch

Verfasst: Mittwoch 8. Juni 2022, 18:46
von burli
Super, ich danke dir für die Mühe. Ich werde mir anschauen, wie ich es umsetze.