Ich habe ein Stück Hardware Ich schreibe eine Klasse für die mehrere Eingänge hat. Jeder Eingang (Kanal) hat einen Namen, so habe ich eine Liste:Erstellen Sie Eigenschaften in der Klasse von Liste/Attribut in __init__
CHANNELS = {"T0": 0, "Tend": 1, "A": 2, "B": 3, "C" : 4, "D" : 5,
"E" : 6, "F" : 7, "G" : 8, "H" : 9}
Nun würde Ich mag eine Eigenschaft erstellen, den Wert jedes Kanals zuzugreifen:
@property
def readT0(self)
return self._query("REQUEST STRING 0")
# the request string expects a number, instead of the real name T0
@property
def readTend(self)
return self._query("REQUEST STRING 1")
usw.
ich würde eher so etwas wie dieses (weniger Quellcode) tun:
def read(self, channel)
return self._query("REQUEST STRING %s" % channel)
und eine Art von Übersetzung verwenden, um das erstellen Attribute:
def __init__ bla bla:
bla bla
for x in CHANNELS:
setattr(self, "read" + str(x), self.read(CHANNELS[x])
so
class.readA # channel A value: 10
> 10
class.readT0 # channel T0 value: 0.11
> 0.11
Auf diese Weise, wenn die Hardware mehr Kanäle verwendet, ich zum CHANNELS
Wörterbuch nur hinzufügen kann. Oder gibt es einen besseren Weg?
Da ich nur Werte lesen möchte, würde ich hier aufhören. Aber kann man das auch mit einem Setter kombinieren?
edit:
ich klären müssen: Ich will nicht, um das Wörterbuch ändern oder die Werte des Wörterbuchs zur Laufzeit zugreifen, möchte ich es auf Klassenerstellung verwenden, um mehrere Attribute für eine Hardware zu erstellen Lesen Sie die Hardwarewerte.
Die Hardware ist ein ADC mit Kanälen. Ich kann mit
someclass._query("REQUEST STRING i")
# i is the channel number and returns the ADC value (e.g. 10.45 V)
Warum willst du da drin lesen? Wäre 'class.A0' nicht ordentlicher? Wie entspricht '_query' dem Wörterbuch? – jonrsharpe
Hallo, 'Klasse.T0' oder' Klasse.A' wäre in der Tat schöner, aber die Kanäle haben unterschiedliche Eigenschaften, so dass 'lesen' sich gut in' class.delayT0' und 'class.offsetT0' ändern könnte ... Don ' Ich weiß, was Sie mit "korrespondieren" meinen: '_query()' ist eine com-Funktion, die von der Hardware liest. – Wolf82
Verwenden Sie keine Eigenschaften für etwas, das eine Nebenwirkung hat, das ist schrecklich, verwenden Sie stattdessen Methoden. Erinnere dich an das [zen of python] (https://www.python.org/dev/peps/pep-0020/): Explizit ist besser als implizit. Eine Eigenschaft dient dazu, eine kleine Operation für ein Attribut zu verbergen, ohne eine kostspielige Methode in einem einfachen Attribut zu verschleiern. –