Quindi, ho un gran numero di messaggi di classi di payload per un'API seriale, ognuno dei quali ha un numero di campi immutabili, un metodo di analisi e alcuni metodi che sono condivisi. Il modo in cui sto strutturando questo è che ognuno erediterà da un namedtuple per i comportamenti del campo e riceverà i metodi comuni da una classe genitore. Tuttavia, sto avendo qualche difficoltà con i costruttori:In Python, come posso chiamare la super-classe quando si tratta di una namedtuple una tantum?
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)
Questo funziona, ma ottengo il seguente avviso:
DeprecationWarning: object.__init__() takes no parameters
super(DifferentialSpeed, self).__init__(**kwargs)
Se rimuovo **kwargs
dalla chiamata, sembra ancora funzionare, ma perché? In che modo questi argomenti vengono passati al costruttore per essere passati alla namedtuple? È garantito questo o un risultato casuale di come viene stabilito il mro?
Se volevo stare lontano da Super, e farlo alla vecchia maniera, c'è un modo in cui posso accedere a namedtuple per chiamare il suo costruttore? Preferirei non doverlo fare:
DifferentialSpeed_ = namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):
Sembra un po 'prolisso e inutile.
Qual è la mia migliore linea d'azione qui?
Si noti che se si sta cercando di usare 'namedtuple' per risparmiare memoria, è necessario impostare' __slots__ =() 'nella classe derivata, così come l'altro ereditato classe' Payload', o la classe avrà ancora un '__dict__'. –