Class 继承和导入 -- python

Class inheritance and importing -- python

这可能有点冗长,但我对导入 parent 和 child class.

感到茫然

我感觉在应用 class 名称时我的大小写不正确。我收到错误:

TypeError: Student.__init__() missing 2 required positional arguments: 'age' and 'major'

非常感谢任何帮助。

StudentAdder.py(主要)

import pickle
from sre_constants import SUCCESS
from tkinter import *
from tkinter import messagebox
from student import Student
from person import Person

#main method
def main():

    studentList = []
    #load the list from a pickle file
    with open("student.pickle", "rb") as f:
        studentList = pickle.load(f)

    #addStudent method to append Input to list
    def addStudent():
        name = "name"
        age = "age"
        major = "major"
        name = nameInput.get()
        age = ageInput.get()
        major = majorInput.get()
        studentList.append(Student(name, age, major))
        #save list to pickle file
        with open("student.pickle", "wb") as f:
            pickle.dump(studentList, f)

    #displays a success message upon adding a student
    def onClick():
        messagebox.showinfo("SUCCESS", "Student Added!")

    #create a GUI
    window = Tk()
    window.title("Add a Student")
    window.geometry("325x175")
  
    #create labels and text boxes for each value
    nameLabel = Label(window, text="Name:")
    ageLabel = Label(window, text="Age:")
    majorLabel = Label(window, text="Major:")

    nameInput = StringVar()
    ageInput = StringVar()
    majorInput = StringVar()

    #create grid for labels
    nameLabel.grid(row=0, column=0)
    ageLabel.grid(row=1, column=0)
    majorLabel.grid(row=2, column=0)

    #create input boxes for each value
    nameInput = Entry(window, width = 25)
    ageInput = Entry(window, width = 25)
    majorInput = Entry(window, width = 25)

    #create grid for input boxes
    nameInput.grid(row=0, column=1)
    ageInput.grid(row=1, column=1)
    majorInput.grid(row=2, column=1)

    #create a save button to save the student -- binds commands to button
    saveButton = Button(window, text="Save", command= lambda: [addStudent(), onClick()])
    saveButton.grid(row=3, column=1)

    #create quit button
    quitButton = Button(window, text="Quit", command= window.destroy)
    quitButton.grid(row=4, column=1)

    #start the GUI
    window.mainloop()

    #print the list
    print()
    for student in studentList:
        print(student)

    print()

main()

person.py (Parent Class)

#create a parent class
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def getName(self):
        return self.name

    def getAge(self):
        return self.age

    def setName(self, name):
        self.name = name

    def setAge(self, age):
        self.age = age

    def __str__(self):
        return "Person: " + self.name + " " + str(self.age)

student.py (Child Class)

from person import Person

class Student(Person):
    def __init__(self, name, age, major):
        Student(Person).__init__(self, name, age, major)
        self.name = name
        self.age = age
        self.major = major

    def getMajor(self):
        return self.major

    def setMajor(self, major):
        self.major = major

    def __str__(self):
        return "Student: " + self.name + \
            ", Age: " + str(self.age) + \
            ", Major: " + self.major

看来你的错误是 student.py 中的这一行:

Student(Person).__init__(self, name, age, major)

代码 Student(Person) 正在尝试创建 Student 的新实例,但您只传递了一个参数 (Person) 而不是所需的三个参数 (name, agemajor)。这就是您在错误消息中看到 missing 2 required positional arguments: 'age' and 'major' 的原因。

但是,看起来您实际上是在尝试调用父 class 的 __init__ 方法。你会这样做:

super().__init__(name, age)

请注意,我没有指定 major 参数,因为 Person class 不接受此参数。此外,Person class 的 __init__ 方法已经存储了 nameage 参数,因此您不需要在 Student.__init__.因此,您可以将 Student.__init__ 更改为以下内容:

class Student(Person):
    def __init__(self, name, age, major):
        super().__init__(name, age)
        self.major = major

或者,如果您不想依赖 Person.__init__,您可以省略 super() 调用并自行设置所有属性:

class Student(Person):
    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major