在对象中实现打包/解包

时间:2016-06-15 13:53:19

标签: python python-2.7

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

2 个答案:

答案 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"))