不可迭代的Python输出对象

问题描述 投票:0回答:1

我在这里看不到一个我可以理解的相关答案。我有一些代码,输出的是我认为可以迭代的列表,但是不能。

代码。

class freqList():
    def __init__(self, startFreq, stopFreq, skip):
        self.startFreq = startFreq
        self.stopFreq = stopFreq
        self.skip = skip

    def __iter__(self):
        pass

    def listFreqs(self):
        return list(range(self.startFreq, self.stopFreq, self.skip))

    def __repr__(self):
        return '{}, {}, {}'.format(
            self.startFreq,
            self.stopFreq,
            self.skip)


    def __str__(self):
        return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
            self.startFreq,
            self.stopFreq,
            self.skip)


print('\n'*4)
listy = freqList(  1000, 5000, 1000)#range cannot use floats, only ints
print(listy.listFreqs())

print('listy type:', type(listy),'\n')

listy_iter = iter(listy)
print('listy_iter type:', type(listy_iter),'\n')

期望的输出

当我实例化这个类时,我想让它返回一个类似于列表的可迭代对象。

尝试了

我看到有人提到 接下来 需要被覆盖,但我不知道那是什么意思,我是OOP的新手,才刚刚开始了解 启动, 重写.

python class oop next iterable
1个回答
1
投票

我在你的类中做了一个小小的调整

class freqList():
    def __init__(self, startFreq, stopFreq, skip):
        self.startFreq = startFreq
        self.stopFreq = stopFreq
        self.skip = skip
        self._freqs = list(range(self.startFreq, self.stopFreq, self.skip))

    def __iter__(self):
        return iter(self._freqs)

    def listFreqs(self):
        return self._freqs

    def __repr__(self):
        return '{}, {}, {}'.format(
            self.startFreq,
            self.stopFreq,
            self.skip)

    def __str__(self):
        return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
            self.startFreq,
            self.stopFreq,
            self.skip)

如果你看,我把列表改为在 __init__ 并存储在一个属性中。然后listFreqs将调用这个属性来显示整个列表。__iter__,其中self._freqs是用神奇的 iter().

如果你的列表定义在 listFreqs,那么每次调用这个方法时,它都会重新计算。此外,在方法被调用之前,类不会知道它是什么,所以它不能在上面创建一个迭代器。


1
投票

在 python 中,一旦你实例化了一个类,你得到的就是一个对象。所以可以试试这个方法

listy_iter = iter(listy.listFreqs())

这将返回函数的返回类型--列表。listFreqs 级别的 freqList()

现在 listy_iter 会有一个列表


1
投票

您的 __iter__() 方法实际上必须返回一个迭代器。像这样。

class freqList():
def __init__(self, startFreq, stopFreq, skip):
    self.startFreq = startFreq
    self.stopFreq = stopFreq
    self.skip = skip

def __iter__(self):
    return iter(range(self.startFreq, self.stopFreq, self.skip))

def __repr__(self):
    return '{}, {}, {}'.format(
        self.startFreq,
        self.stopFreq,
        self.skip)


def __str__(self):
    return 'instance object of frequency list, startFreq:{},stopFreq: {},skip: {}'.format(
        self.startFreq,
        self.stopFreq,
        self.skip)


listy = freqList(  1000, 5000, 1000)

for l in listy:
    print(l)

1
投票

试着阐述一下你的问题 根据我的理解,下面是你要找的东西

  def __iter__(self):
      iter_list = list(range(self.startFreq, self.stopFreq, self.skip))
      for i in iter_list:
           yield i
© www.soinside.com 2019 - 2024. All rights reserved.