如何使用Python创建具有属性的元组?
我有一个类WeightedArc,定义如下:如何使用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
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