所以,我有大量用于串行 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
从通话中删除,它似乎仍然有效,但为什么呢?构造函数的这些参数是如何传递给命名元组的?这是有保证的,还是mro如何建立的随机结果?
如果我想远离超级,并以旧方式做,有什么方法可以访问 namedtuple 来调用它的构造函数吗?我宁愿不必这样做:
DifferentialSpeed_ = namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):
似乎有点冗长和不必要。
我在这里最好的做法是什么?