Сохраняет значения для init, но он продолжает перезаписывать список при чтении нового файла - PullRequest
0 голосов
/ 30 октября 2018

У меня есть два файла и загружаю в класс. Файл один загружается, а затем создает строку, затем файл два загружается и создает строку снова и, наконец, оба в одном списке. Однако, когда я вызываю функцию, она просто перезаписывается новым файлом. Пример: когда файл 2 читается, он создает только строки для файла 2 и перезаписывает файл 1.

    class something():
    def getting(self, y):# string input "0" and "1"
        self.y = y #I have two files. y is a file. So if I have 2 files, then it will store 2 times into the self.y. Example, file one have "0" and "1" string
        self.fun1()

    def fun1(self):
        self.xx = []
        for i in range(2):
            self.xx.append("{} and {}".format(self.y, i)) #After getting the self.y, then it will append it into self.xx.
            # Example, 0 and 0 then 0 and 1; for y in "0" string.
            # Next, 1 and 0 then 1 and 1; for y in "1" string
            self.take()

    def take(self):
        return self.xx



a = ["0", "1"]
aaa = something()
for x in a:

    aaa.getting(x)

print(aaa.take())

Токовый выход:

['1 and 0', '1 and 1']

Ожидается для a.take:

['0 and 0', '0 and 1', '1 and 0', '1 and 1']

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Основано на старом посте:

Я думаю, что вы перегружаете переменную 'a' в следующем фрагменте кода. К тому времени, когда вы закончите с первой итерацией цикла for, a будет изменен с кодом внутри цикла. Вместо этого вы должны использовать другую переменную для отслеживания вашего списка (что-то ()).

a = ["0", "1"]
for x in a:
    a = something()
    a.getting(x)

    print(a.take)

Попробуйте это:

a = ["0", "1"]
b = something()
for x in a:  
    b.getting(x)
    print(b.take)

Ответ на обновленное сообщение:

Вы сбрасываете self.xx в fun1 (). То, что вы должны сделать, это установить self.xx на [] в функции init чего-то (). И не устанавливайте self.xx в [] при запуске fun1 ()

0 голосов
/ 30 октября 2018

Оригинальный вопрос:

Метод __init__ вызывается только при создании объектов. Например:

o = something()

Создает экземпляр класса something (и сохраняет его как o) и выполняет метод __init__.

Дальнейшие (другие) вызовы методов, такие как метод getting, для объекта o не будут повторно выполнять метод __init__.

Возможное решение - переместить код, в который вы добавляете список, в вызываемый вами метод:

class something():
    def __init__(self): 
        self.xx = []

    def getting(self, y):
        for i in range(2):
            self.xx.append("{} and {}".format(y, i))

o = something()

o.getting("0")
o.getting("1")

print(o.xx)

Это дает результат, который вы описали, однако я не совсем уверен, чего вы пытаетесь достичь. Я также рекомендовал бы использовать альтернативные имена переменных / методов / классов, имена которых описывают их функциональные возможности в удобочитаемости.

Редактировать 2: Вы по-прежнему перезаписываете ряд переменных, попробуйте:

class something():
    def __init__(self):
        self.xx = []

    def getting(self, y):# string input "0" and "1"
        self.y = y #I have two files. y is a file. So if I have 2 files, then it will store 2 times into the self.y. Example, file one have "0" and "1" string
        self.fun1()

    def fun1(self):
        for i in range(2):
            self.xx.append("{} and {}".format(self.y, i)) #After getting the self.y, then it will append it into self.xx.
            # Example, 0 and 0 then 0 and 1; for y in "0" string.
            # Next, 1 and 0 then 1 and 1; for y in "1" string

    def take(self):
        return self.xx



a = ["0", "1"]
aaa = something()
for x in a:
    aaa.getting(x)

print(aaa.take())
...