In Python, wie rufe ich die super-Klasse, wenn es ein one-off namedtuple?

So, ich habe eine große Anzahl von message-Payload-Klassen für eine serielle API, von denen jeder eine Anzahl von unveränderlich Felder einem parse-Methode, und einige Methoden, die freigegeben sind. Die Art, wie ich bin Strukturierung ist, dass die einzelnen Erben aus namedtuple für den Bereich Verhalten, und Sie erhalten die gemeinsamen Methoden von einer übergeordneten Klasse. Aber, ich habe einige Schwierigkeiten mit den Konstruktoren:

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 bekomme die folgende Warnung:

DeprecationWarning: object.__init__() takes no parameters
  super(DifferentialSpeed, self).__init__(**kwargs)

Wenn ich entfernen **kwargs von der Aufforderung, es scheint immer noch zu funktionieren, aber warum? Wie sind diese Argumente dem Konstruktor übergeben überholt durch die namedtuple? Ist dies gewährleistet, oder ein zufälliges Ergebnis, wie die mro wird gegründet?

Wenn ich wollte, zu bleiben Weg von super, und machen es auf die alte Art und Weise, gibt es eine Möglichkeit, ich kann auf die namedtuple zu Ihr Konstruktor aufgerufen? Ich würde lieber nicht haben, um dies zu tun:

DifferentialSpeed_ = namedtuple('DifferentialSpeed_', 
    'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):

Scheint Art von verbose und unnötig.

Was ist meine beste Vorgehensweise hier?

  • Beachten Sie, dass, wenn Sie versuchen, zu verwenden namedtuple Speicher zu speichern, müssen Sie __slots__ = () in der abgeleiteten Klasse als auch die anderen übernommenen Payload Klasse, oder die Klasse noch eine __dict__.
InformationsquelleAutor mikepurvis | 2010-11-01
Schreibe einen Kommentar