Пустые списки в новом классе - PullRequest
0 голосов
/ 30 октября 2018

У меня есть код ниже. Class1 присваивает значения спискам (list1, list2, list3). При использовании этих списков внутри Class2 оператор print, используемый в качестве теста внутри функции 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

Ответы [ 3 ]

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

Я думаю, что есть некоторая путаница в том, как использовать наследование в 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.

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

Итак, что вы хотите сделать, после получения 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.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...