【问题标题】:Unpack class variables解包类变量
【发布时间】:2017-09-10 21:02:28
【问题描述】:

使用 collections.namedtuple 可以创建 Point = namedtuple('Point', 'x y') 并设置 p = Point(2,3),然后使用 x, y = p 解压缩 p

类可以做类似的事情吗?例如

class Point:
    def __init__(self,x ,y):
        self.x = x
        self.y = y
p = Point(2,3)
x,y = p
print(f"x: {x}, y: {y}")
>>> x: 2, y: 3

这当然会导致错误,但是如何获得namedtuple的效果呢?

【问题讨论】:

  • tl;dr:实现__iter__
  • 你可以,但在大多数情况下,与类有关是一件奇怪的事情。元组是不可变的,因此命名键和索引之间的映射也是不可变的。类通常不提供相同的保证。

标签: python-3.x class


【解决方案1】:
class Point:
    def __init__(self, x, y):
        self._flag = 2
        self.x = x
        self.y = y

    def __iter__(self):
        return self

    def __next__(self):
        if self._flag == 2:
            self._flag = 1
            return self.x
        elif self._flag == 1:
            self._flag = 0
            return self.y
        else:
            raise StopIteration()


p = Point(5, 6)

(x, y) = p

【讨论】:

  • class Point(tuple): 反而给了我tuple() takes at most 1 argument (2 given)
【解决方案2】:

为了获得命名元组的效果,让你的类成为元组的子类。 看我类似的question 并回答

【讨论】:

    猜你喜欢
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2022-01-20
    • 1970-01-01
    • 2017-12-23
    相关资源
    最近更新 更多