Also, ich habe eine große Anzahl von Nachrichten Payload-Klassen für eine serielle API, von denen jede eine Reihe von unveränderlichen Feldern, eine Analyse-Methode und einige Methoden, die freigegeben sind. Die Art, wie ich dies strukturiere, ist, dass jeder von einem namedtuple für das Feldverhalten erbt und die üblichen Methoden von einer Elternklasse erhält. Aber ich habe einige Schwierigkeiten mit den Konstrukteuren mit:Wie rufe ich in Python die Superklasse auf, wenn es sich um ein einmal benanntes Tupel handelt?
class Payload:
def test(self):
print("bar")
class DifferentialSpeed(Payload, namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')):
__slots__ =()
def __init__(self, **kwargs):
super(DifferentialSpeed, self).__init__(**kwargs)
# TODO: Field verification
print("foo")
@classmethod
def parse(self, raw):
# Dummy for now
return self(left_speed = 0.0, right_speed = 0.1,
left_accel = 0.2, right_accel = 0.3)
def __str__(self):
return "Left Speed: %fm/s\nRight Speed: %fm/s\n"\
"Left Acceleration: %fm/s^2\nRight Acceleration: %fm/s^2" % (
self.left_speed, self.right_speed, self.left_accel, self.right_accel)
payload = DifferentialSpeed.parse('dummy')
print(payload)
Dies funktioniert, aber ich erhalte die folgende Warnung:
DeprecationWarning: object.__init__() takes no parameters
super(DifferentialSpeed, self).__init__(**kwargs)
Wenn ich **kwargs
aus dem Anruf zu entfernen, ist es noch zu funktionieren scheint, aber warum? Wie werden diese Argumente für den Konstruktor an das namedtuple übergeben? Ist dies garantiert, oder ein zufälliges Ergebnis davon, wie die mro etabliert wird?
Wenn ich von Super wegbleiben und es auf die alte Art machen wollte, gibt es eine Möglichkeit, auf das namedtuple zuzugreifen, um seinen Konstruktor aufzurufen? Ich würde es lieber nicht tun müssen:
DifferentialSpeed_ = namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):
Scheint irgendwie ausführlich und unnötig.
Was ist meine beste Vorgehensweise hier?
Beachten Sie, wenn Sie versuchen, verwenden 'namedtuple' Speicher zu speichern, die Sie einstellen müssen' __slots__ =() 'in der abgeleiteten Klasse sowie die anderen erblichen' Payload' Klasse oder die Klasse wird immer noch ein "__dict__" haben. –