そのため、シリアル API 用の多数のメッセージ ペイロード クラスがあり、それぞれに多数の不変フィールド、解析メソッド、および共有されるいくつかのメソッドがあります。私がこれを構築している方法は、それぞれがフィールドの動作の名前付きタプルから継承し、親クラスから共通のメソッドを受け取ることです。ただし、コンストラクターにはいくつかの問題があります。
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が確立される方法のランダムな結果ですか?
スーパーから離れて古い方法でそれを行いたい場合、namedtuple にアクセスしてそのコンストラクターを呼び出す方法はありますか? 私はむしろこれを行う必要はありません:
DifferentialSpeed_ = namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):
冗長で不必要なようです。
ここでの私の最善の行動は何ですか?