【发布时间】:2019-12-03 11:14:38
【问题描述】:
出于学习目的,我尝试实现一个类,该类执行标准 Python 中 numpy 数组的一些基本功能。但是,如果我对数组类型的两个对象使用操作(加、减、乘、真除法),它的行为就会不正确。在这种情况下,它会在返回正确结果和返回 arr 类型的空对象之间交替。
class arr:
def __init__(self, vals):
self.vals = vals
self.idx = 0
def __repr__(self):
return f'arr({self.vals})'
def __add__(self, new_value):
if type(new_value) in [int, float]:
return arr([val + new_value for val in self.vals])
if type(new_value)==arr:
return arr([val + new_val for val, new_val in zip(self.vals, new_value)])
def __sub__(self, new_value):
if type(new_value) in [int, float]:
return arr([val - new_value for val in self.vals])
if type(new_value)==arr:
return arr([val - new_val for val, new_val in zip(self.vals, new_value)])
def __mul__(self, new_value):
if type(new_value) in [int, float]:
return arr([val * new_value for val in self.vals])
if type(new_value)==arr:
return arr([val * new_val for val, new_val in zip(self.vals, new_value)])
def __truediv__(self, new_value):
if type(new_value) in [int, float]:
return arr([val / new_value for val in self.vals])
if type(new_value)==arr:
return arr([val / new_val for val, new_val in zip(self.vals, new_value)])
def __iter__(self):
return self
def __next__(self):
self.idx += 1
try:
return self.vals[self.idx - 1]
except IndexError:
self.idx = 0
raise StopIteration
def __len__(self):
return len(self.vals)
我可以追溯到这样一个事实,即当我例如添加两个这样的数组,第二个数组的 idx 变量不会在我使用这样的操作时每秒钟设置回 0。我怀疑使用 zip() 函数的列表理解只会引发两个数组中的第一个的 StopIteration 错误并在它可以为第二个数组引发它之前停止?如何正确实施?
【问题讨论】:
-
将
__iter__更改为return iter(self.vals)?您还可以将self.idx重置为0inside__iter__。 -
所以如果我理解正确,
__iter__会在每次新迭代开始时被调用?无论如何,你的第二个解决方案对我有用,但第一个没有。
标签: python arrays oop iterator