新课程中的空列表

时间:2018-10-30 10:17:08

标签: python python-3.x inheritance

我有下面的代码。 Class1将值关联到列表(list1,list2,list3)。在Class2中使用这些列表时,在calc函数中用作测试的print语句将打印一个空列表'[]',而不是存储在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 :(得分:2)

我认为在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关键字的函数时,您将得到一个错误。

答案 1 :(得分:0)

您可以用getList1填充Class1。在您的示例中,您只需使用空列表对其进行初始化。

答案 2 :(得分:0)

因此,您要做的是从文件中获取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。分别为arg1、2和3调用getList,它们就会被填充。然后,您调用calculate填充arg4。