Как в Python вызвать суперкласс, если это одноразовый именованный набор?

Итак, у меня есть большое количество классов полезной нагрузки сообщений для последовательного API, каждый из которых имеет ряд неизменяемых полей, метод синтаксического анализа и некоторые общие методы. Я структурирую это так, что каждый будет наследовать от именованного кортежа поведения полей и получать общие методы от родительского класса. Тем не менее, я' m возникли некоторые трудности с конструкторами:

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)

Это работает, но я получаю следующее предупреждение:

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

Если я удалю ** kwargs из вызова, он все равно будет работать, но почему? Как эти аргументы конструктора передаются в namedtuple? Это гарантировано или это случайный результат того, как mro устанавливается?

Если бы я хотел держаться подальше от super и сделать это по-старому, могу ли я каким-то образом получить доступ к namedtuple для вызвать его конструктор? Я бы предпочел не делать этого:

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

Кажется многословным и ненужным.

Каков мой лучший способ действий?

13
задан pppery 24 May 2016 в 13:24
поделиться