如何使用Python创建具有属性的元组?

如何使用Python创建具有属性的元组?,python,inheritance,tuples,Python,Inheritance,Tuples,我有一个类WeightedArc,定义如下: class Arc(tuple): @property def tail(self): return self[0] @property def head(self): return self[1] @property def inverted(self): return Arc((self.head, self.tail)) def __eq__(self, other): ret

我有一个类WeightedArc,定义如下:

class Arc(tuple):

  @property
  def tail(self):
    return self[0]

  @property
  def head(self):
    return self[1]

  @property
  def inverted(self):
    return Arc((self.head, self.tail))

  def __eq__(self, other):
    return self.head == other.head and self.tail == other.tail

class WeightedArc(Arc):
  def __new__(cls, arc, weight):
    self.weight = weight
    return super(Arc, cls).__new__(arc)

此代码显然不起作用,因为未为
WeightArc.\uuuu new\uuuu
定义
self
。如何将属性权重分配给WeightArc类?

原始代码的固定版本是:

class WeightedArc(Arc):
    def __new__(cls, arc, weight):
        self = tuple.__new__(cls, arc)
        self.weight = weight
        return self
查看collections.namedtuple的详细选项的另一种方法是查看如何对tuple进行子类化的示例:

您可以剪切、粘贴和修改此代码,或者仅从中创建子类,如中所示

要扩展此类,请构建Arc中的字段:

WeightedArc = namedtuple('WeightedArc', Arc._fields + ('weight',))
查看collections.namedtuple的verbose选项的另一种方法是查看如何对tuple进行子类化的示例

更好的是,为什么不使用namedtuple呢?:)


你为什么用new代替init?呃,我还以为init不能用元组呢。我觉得我对新事物的理解太离谱了。你说得对。Init不适用于元组。它们完全由new填充。这实际上取决于您是否希望“weight”进入实例字典(如果是这样,init将在子类上工作)。如果希望将权重作为元组中的一个字段,则可以扩展定义,如下面的namedtuple示例所示。我刚刚进行了编辑,以展示如何修改原始代码以及显示namedtuple()方法。对于后者,我还添加了RealCollections模块使用的相同导入。
WeightedArc = namedtuple('WeightedArc', Arc._fields + ('weight',))
class Arc(object):
    def inverted(self):
        d = self._asdict()
        d['head'], d['tail'] = d['tail'], d['head']
        return self.__class__(**d)

class SimpleArc(Arc, namedtuple("SimpleArc", "head tail")): pass

class WeightedArc(Arc, namedtuple("WeightedArc", "head tail weight")): pass