在对象中实现打包/解包

2024-09-26 22:55:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个只包含属性的类,我想打包/解包来处理它。我应该实现什么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


Tags: nameselfage属性objectinitdefitem
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"))

您可以解压缩任何^{}。这意味着您需要实现__iter__方法,并返回迭代器。在您的情况下,这可能只是:

def __iter__(self):
    return iter((self.name, self.age, self.gender))

或者,您可以将类设置为^{},然后__iter__return self,您需要实现__next__;这是更多的工作,可能不值得付出努力

有关更多信息,请参见What exactly are Python's iterator, iterable, and iteration protocols?


根据我上面链接的问题,您还可以使用__getitem__实现一个iterable:

def __getitem__(self, index):
    return (self.name, self.age, self.gender)[index]

相关问题 更多 >

    热门问题