Por lo tanto, tengo un gran número de clases de carga útil de mensaje para una API en serie, cada una de las cuales tiene varios campos inmutables, un método de análisis sintáctico y algunos métodos que se comparten. La forma en que estoy estructurando esto es que cada uno heredará de un namedtuple los comportamientos de campo y recibirá los métodos comunes de una clase principal. Sin embargo, estoy teniendo algunas dificultades con los constructores:En Python, ¿cómo llamo a la súper clase cuando se trata de una sola vez?
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)
Esto funciona, pero me da la siguiente advertencia:
DeprecationWarning: object.__init__() takes no parameters
super(DifferentialSpeed, self).__init__(**kwargs)
Si quito **kwargs
de la llamada, todavía parece funcionar, ¿pero por qué? ¿Cómo se transmiten esos argumentos al constructor al namedtuple? ¿Esto está garantizado, o es un resultado aleatorio de cómo se establece el mro?
Si quisiera mantenerme alejado de super, y hacerlo de la manera antigua, ¿hay alguna forma de que pueda acceder a la llamada namedtuple para llamar a su constructor? Prefiero no tener que hacer esto:
DifferentialSpeed_ = namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):
Parece tipo de detallado e innecesario.
¿Cuál es mi mejor línea de conducta aquí?
Tenga en cuenta que si usted está tratando de usar 'namedtuple' para ahorrar memoria, es necesario establecer' __slots__ =() 'en la clase derivada, así como la otra heredada clase' Payload', o de la clase todavía tendrá un '__dict__'. –