python выходной объект не повторяется - PullRequest
0 голосов
/ 16 июня 2020

Я не нашел здесь подходящего ответа, который я мог бы понять. У меня есть код, который выводит то, что, как я думал, будет списком, который я мог бы перебрать, но не могу.

код:

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')

Желаемый результат

Когда я создаю экземпляр класса, я хочу, чтобы он возвращал повторяющийся объект в виде списка.

Пробовал

Я видел упоминание о next , которое необходимо переопределить, но я не знаю, что это значит, я новичок в OOP и только что получил моя голова вокруг init , str и repr .

Ответы [ 4 ]

1 голос
/ 16 июня 2020

Попробуйте подробнее рассказать о своей проблеме. Насколько я понимаю, ниже указано, что вы ищете

  def __iter__(self):
      iter_list = list(range(self.startFreq, self.stopFreq, self.skip))
      for i in iter_list:
           yield i
1 голос
/ 16 июня 2020

Я сделал небольшую корректировку в вашем классе

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 обернут магией c iter().

Если у вас есть список, определенный в listFreqs, он будет пересчитывать каждый раз, когда вы вызываете Этот метод. Кроме того, класс не будет знать, что это такое, пока не будет вызван метод, поэтому он не может создать для него итератор.

1 голос
/ 16 июня 2020

Ваш метод __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 голос
/ 16 июня 2020

В python после создания экземпляра класса вы получаете объект. Поэтому вместо этого попробуйте это

listy_iter = iter(listy.listFreqs())

Это вернет список, который является типом возвращаемого значения функции listFreqs класса freqList()

Теперь listy_iter будет иметь список

...