2024-09-26 22:55:41 发布
网友
我有一个只包含属性的类,我想打包/解包来处理它。我应该实现什么collections.abc来获得这种行为
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
namedtuple
另一种选择是named tuple
Item = collections.namedtuple('Item', ['name', 'age', 'gender'])
所以这是开箱即用的:
a, b, c = Item("Henry", 90, "male")
如果您使用的是Python 3.7+,那么还可以利用dataclasses这一功能更加强大。但您需要显式调用astuple:
astuple
@dataclasses.dataclass class Item(object): name: str age: int gender: str a, b, c = dataclasses.astuple(Item("Henry", 90, "male"))
您可以解压缩任何^{}。这意味着您需要实现__iter__方法,并返回迭代器。在您的情况下,这可能只是:
__iter__
def __iter__(self): return iter((self.name, self.age, self.gender))
或者,您可以将类设置为^{},然后__iter__将return self,您需要实现__next__;这是更多的工作,可能不值得付出努力
return self
__next__
有关更多信息,请参见What exactly are Python's iterator, iterable, and iteration protocols?
根据我上面链接的问题,您还可以使用__getitem__实现一个iterable:
__getitem__
def __getitem__(self, index): return (self.name, self.age, self.gender)[index]
另一种选择是named tuple
所以这是开箱即用的:
如果您使用的是Python 3.7+,那么还可以利用dataclasses这一功能更加强大。但您需要显式调用
astuple
:您可以解压缩任何^{} 。这意味着您需要实现
__iter__
方法,并返回迭代器。在您的情况下,这可能只是:或者,您可以将类设置为^{} ,然后
__iter__
将return self
,您需要实现__next__
;这是更多的工作,可能不值得付出努力有关更多信息,请参见What exactly are Python's iterator, iterable, and iteration protocols?
根据我上面链接的问题,您还可以使用
__getitem__
实现一个iterable:相关问题 更多 >
编程相关推荐