gpt4 book ai didi

inheritance - 在 Python 中,当它是一次性命名元组时如何调用父类(super class)?

转载 作者:行者123 更新时间:2023-12-03 09:43:35 24 4
gpt4 key购买 nike

因此,我有大量用于串行 API 的消息 Payload 类,每个类都有许多不可变字段、一个解析方法和一些共享的方法。我构建它的方式是每个都将从字段行为的命名元组继承,并从父类接收通用方法。但是,我在构造函数方面遇到了一些困难:

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从通话中,它似乎仍然有效,但为什么呢?构造函数的这些参数如何传递给命名元组?这是保证的,还是随机结果 先生成立?

如果我想远离 super ,并按照旧的方式来做,有什么方法可以访问 namedtuple 来调用它的构造函数吗?我宁愿不必这样做:
DifferentialSpeed_ = namedtuple('DifferentialSpeed_', 
'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):

似乎有点冗长和不必要。

我最好的做法是什么?

最佳答案

首先,namedtuple(whatever)继承自 tuple ,它是不可变的,而不可变类型不用担心 __init__ ,因为到时候__init__被称为对象已经构建。如果您想将参数传递给 namedtuple您必须覆盖的基类 __new__反而。

可以看到namedtuple()的结果的定义通过传入 verbose=true争论;我觉得很有教育意义。

关于inheritance - 在 Python 中,当它是一次性命名元组时如何调用父类(super class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4071765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com