Пустые списки в новом классе

У меня есть код ниже. Class1 присваивает значения спискам (list1, list2, list3). При использовании этих списков внутри Class2 оператор печати, используемый в качестве теста внутри функции calc, печатает пустой список '[]' вместо данных, которые были сохранены внутри него в Class1. Таким образом, вычисление также вернет пустое значение.

    class Class2(Class1):
        def __init__(self, Class1):
            self.arg1 = Class1.arg1
            self.arg2 = Class1.arg2
            self.arg3 = Class1.arg3
            self.arg4 = []

        def calc(self, Class1):
            for row in Class1.arg1:
                self.arg4.append(Class1.list2  + Class1.list3)
                print(Class1.arg1)
            return self.arg4    

    cInput = Class1([],[],[])            
    Test = Class2(cInput ).calc(cInput)

Ниже мой Class1 и пример того, как я заполняю список (Class1 работает правильно)

class Class1:
  def __init__(self, list1, list2, list3):
    self.arg1= list1
    self.arg2= list2
    self.arg3= list3

def getList1(filename1):
    with open(filename1, "r") as csv1  
        csvReader1 = csv.DictReader(csv1)
        list1= []
        for row in zip(csvReader1):  
          list1.append((row1["arg1"]))

        return list1

В чем именно заключается ваш вопрос?

Dennis Patterson 30.10.2018 11:19

@DennisPatterson Как мне получить значения, которые я назначил из class1 в class2 вместо пустых списков

user7189561 30.10.2018 11:21

Как выглядит ваш Class1?

DocDriven 30.10.2018 11:23

@DocDriven добавил функцию примера Class1

user7189561 30.10.2018 11:27

в getList1 Вы заполняете list1, а затем возвращаете его. Может быть, вы добавляете значения этого списка в self.arg1 или просто забыли это сделать, что привело к вашей проблеме?

Dennis Patterson 30.10.2018 11:38

@DennisPatterson Когда я вызываю метод getList1, я заполняю его, используя list1 = getList1 ("расположение файла"

user7189561 30.10.2018 11:47

@Liights Да, но какой смысл, если вы никогда не обновляете self.arg1. Вы можете менять list1 сколько угодно, это не изменит self.arg1, если вы сами этого не сделаете. Позвольте мне объяснить больше: в class2 вы назначаете его атрибуты значению Class1.arg1, а не list1, который больше является локальной переменной, которая никогда не выходит из Class1. То, что переходит от Class1 к Class2, - это self.arg, и это вы никогда не меняете. Вы меняете только list1, и это не меняет self.arg1

Dennis Patterson 30.10.2018 11:51

@Liights Я заметил кое-что еще. В вашем коде вы делаете Class2 наследником Class1. Итак, теперь любое свойство в Class1 также находится в Class2. Вам не нужно много копировать вручную.

Dennis Patterson 30.10.2018 11:56

@DennisPatterson Каким будет правильный способ обновления self.arg1, а не только list1?

user7189561 30.10.2018 12:06

@Liights просто сделайте self.arg1.extend(list1) в конце, когда вы закончите заполнять list1

Dennis Patterson 30.10.2018 12:34

@DennisPatterson Я забыл, что у меня есть строка first_Object = Class1 (list1, list2, list3), это будет правильный способ сделать это?

user7189561 30.10.2018 12:57

@Liights Это нормально, но если вы так намерены вручную копировать переменные из class1 в class2, тогда вы хотите сделать: list1 = getList1("filelocation") | self.arg1.extend(list1) И то же самое для 2 и 3. ("|" означает новую строку, поскольку это комментарий) :)

Dennis Patterson 30.10.2018 13:02

@DennisPatterson добавление self.arg1.extend (list1) создает еще одну проблему. У меня есть функция за пределами Class1, которую я вызываю, чтобы затем вызвать каждую отдельную функцию внутри Class1 (именно там содержатся те две предыдущие строки, которые я упомянул), что означает, что у нее не будет доступа к 'self'

user7189561 30.10.2018 13:38

@Liights тогда вам нужно перейти на себя. Вы видите, что это становится сложным и беспорядочным, но это то, что наследование ООП делает за кулисами. Вот почему сделать класс 2 потомком Clas1 проще, чем весь этот беспорядок.

Dennis Patterson 30.10.2018 13:41

@DennisPatterson Что бы я для этого изменил?

user7189561 30.10.2018 13:43

@Liights посмотрите на одобренный ответ.

Dennis Patterson 30.10.2018 13:44

@DennisPatterson Хотя этот ответ решает множество проблем, мои списки все еще кажутся пустыми. Я, должно быть, что-то где-то упускаю

user7189561 30.10.2018 13:47

@Liights Хорошо, я напишу вам четкий ответ. Может быть, тогда вы сможете принять это, поскольку этот вопрос звучит слишком долго

Dennis Patterson 30.10.2018 13:48

@Liights Подскажите, работает ли это. Я думаю, это то, что вы имели в виду. Если нет - объясните мне что-нибудь. Я с вами здесь весь день :) Также, пожалуйста, прочтите объяснение, чтобы понять, что происходит

Dennis Patterson 30.10.2018 14:08

@Liights помог мой ответ?

Dennis Patterson 30.10.2018 14:22

@DennisPatterson Да, в настоящее время работаю, но применяю эти изменения

user7189561 30.10.2018 14:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
21
952
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете заполнить Class1 с помощью getList1. В вашем примере вы просто инициализируете его пустыми списками.

Когда я вызываю метод getList1, я заполняю его, используя list1 = getList1 ("filelocation")

user7189561 30.10.2018 11:46

Я думаю, что есть некоторая путаница в том, как использовать наследование в Python. При наследовании от класса дочерний класс, естественно, имеет доступ к переменным своего родительского класса. Нет необходимости вручную копировать его в функции __init__. Вы можете просто вызвать конструктор родительского элемента через super() и повторно использовать его для дочернего элемента.

class Class1:

    def __init__(self, list1, list2, list3):
        self.arg1 = list1
        self.arg2 = list2
        self.arg3 = list3

class Class2(Class1):

    def __init__(self, list1, list2, list3):
        super().__init__(list1, list2, list3)
        self.arg4 = []

    def calc(self):
        for row in self.arg1:
            self.arg4.append(self.arg2 + self.arg3)
            print(self.arg1)
        return self.arg4

cInput = Class2([], [], [])

Test = cInput.calc()

Я надеюсь, что код устраняет некоторую путаницу. И последнее: вы пытались сделать свой метод getList1 статическим? Таким образом, вы получите ошибку при объявлении функции без ключевого слова self.

После внесения этих изменений и запуска печати все еще печатается []

user7189561 30.10.2018 12:04

Это ожидаемое поведение. При создании экземпляра класса вы инициализируете все его переменные как пустой массив. Когда вы вызываете функцию calc, она пропускает цикл for, так как в arg1 нет элементов, которые нужно перебирать. Возвращает пустой список arg4. Если вы хотите это изменить, просто используйте в конструкторе непустые списки.

DocDriven 30.10.2018 12:23

Разве списки не должны заполняться из Class1, поэтому списки в конструкторе не должны быть пустыми?

user7189561 30.10.2018 12:27

Нет, какая строка заставляет вас так думать?

DocDriven 30.10.2018 12:31
Ответ принят как подходящий

Итак, что вы хотите сделать, это после получения list1 из файла добавить его в self.arg1. Сделайте так, чтобы Class2 унаследовал все, чтобы вы могли звонить с него напрямую

class Class1:
    def __init__(self, list1, list2, list3):
        self.arg1= list1
        self.arg2= list2
        self.arg3= list3

    def getList1(self,filename1):
        list1 = [1,2,3,4]

        self.arg1.extend(list1)
        return list1

   # another function def getList2(self, filename): ...

   # and the last function def getList3(self, filename): ...


class Class2(Class1):
    def __init__(self, list1, list2, list3):
        super().__init__(list1, list2, list3)
        self.arg4 = []

    def calc(self):
        for row in self.arg1:
            self.arg4.append(self.arg2 + self.arg3)
            print(self.arg1)
        return self.arg4

def populate():
    cInput = Class2([], [], [])
    list1 = cInput.getList1("filename")
    #Do the same with list2 (list2 = cInput.getList2("filename")
    #Do the same with list3 (list3 = cInput.getList3("filename")

    Test = cInput.calc()
    print(Test)

populate()

Class2 имеет все, что есть в Class1, включая методы getList. Итак, что происходит, когда вы создаете экземпляр Class2, он автоматически создает экземпляр Class1 и добавляет его в Class2 (имеет ли это какой-то смысл?)

Итак, теперь класс 2 будет иметь arg1, arg2, arg3 и arg4. Вы вызываете getList для каждого из arg1, 2 и 3, и они заполняются. Затем вы вызываете calculate, чтобы заполнить arg4.

Это много деталей и работает! спасибо также @DocDriven за его ответ

user7189561 30.10.2018 15:12

Другие вопросы по теме