class Vector2d:
typecode = 'd'
def __init__(self, x, y):
self.x = float(x)
self.y = float(y)
def __iter__(self):
return (i for i in (self.x, self.y))
def __repr__(self):
class_name = type(self).__name__
return '{}({!r}, {!r})'.format(class_name, *self) #(1)
def __str__(self):
return str(tuple(self))
def __bytes__(self):
return (bytes([ord(self.typecode)]) +
bytes(array(self.typecode, self)))
def __eq__(self, other):
return tuple(self) == tuple(other)
def __abs__(self):
return math.hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self))
我在读《流畅的python》,上面代码(1)处的self,我不明白这里为什么要加号,这个类实现了__iter__,可以迭代,拆包,直接写self不就可以把self.x,self.y传后两个{!r}里了吗?在我的理解中,只有定义不定参数的函数形参中会用到*,还有就是平行赋值,比如:
>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])
这个类的确实现了迭代协议,不过需要在加*后触发__iter__这个方法