我有一个只包含属性的类,我想打包/解包来处理它。我应该实现collections.abc
来实现此行为?
class Item(object):
def __init__(self, name, age, gender)
self.name = name
self.age = age
self.gender = gender
a, b, c = Item("Henry", 90, "male")
我想避免使用namedtuple
。
答案 0 :(得分:5)
您可以解压缩任何Iterable
。这意味着您需要实现__iter__
方法,并返回迭代器。在您的情况下,这可能只是:
def __iter__(self):
return iter((self.name, self.age, self.gender))
或者,您可以将课程设为Iterator
,然后__iter__
设为return self
,您需要实施__next__
;这是更多的工作,可能不值得努力。
有关详细信息,请参阅What exactly are Python's iterator, iterable, and iteration protocols?
根据我上面链接的问题,您还可以使用__getitem__
:
def __getitem__(self, index):
return (self.name, self.age, self.gender)[index]
答案 1 :(得分:2)
另一种选择是named tuple
Item = collections.namedtuple('Item', ['name', 'age', 'gender'])
因此开箱即用:
a, b, c = Item("Henry", 90, "male")
如果您使用的是Python 3.7+,则还可以利用功能更强大的dataclasses。但是您需要显式调用astuple
:
@dataclasses.dataclass
class Item(object):
name: str
age: int
gender: str
a, b, c = dataclasses.astuple(Item("Henry", 90, "male"))