所以,我有一个用于串行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建立的随机结果?如果我想避免使用super,按照旧的方式做,有没有办法访问namedtuple以调用其构造函数?我不想这样做:
DifferentialSpeed_ = namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):
看起来有些啰嗦和不必要。
在这种情况下,我的最佳行动方案是什么?
namedtuple
来节省内存,则需要在派生类以及其他继承的Payload
类中设置__slots__ =()
,否则该类仍将具有__dict__
。 - Glenn Maynard