Наследование и импорт классов — python

Это может быть немного длинно, но я не могу импортировать родительский и дочерний классы.

У меня такое чувство, что я неправильно использую заглавные буквы при применении имен классов. Я получаю сообщение об ошибке:

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()

человек.py (Родительский класс)

#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)

студент.py (дочерний класс)

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(Person).__init__(self, name, age, major) внутрь Student.__init__? Вы, наверное, хотите вызвать super().__init__(name, age), а затем self.major = major.

Mark 10.04.2022 05:34
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
1
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, ваша ошибка заключается в этой строке в student.py:

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

Код Student(Person) пытается создать новый экземпляр Student, но вы передаете только один аргумент (Person) вместо необходимых трех (name, age и major). Вот почему вы видите missing 2 required positional arguments: 'age' and 'major' в своем сообщении об ошибке.

Однако похоже, что вы на самом деле пытаетесь вызвать метод __init__ родительского класса. Вы бы сделали это так:

super().__init__(name, age)

Обратите внимание, что я не указал аргумент major, так как класс Person не принимает его в качестве параметра. Кроме того, метод __init__ класса Person уже хранит параметры name и age, поэтому вам не нужно делать это в 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

Спасибо за быстрый ответ. Я внес изменения, которые вы предложили super().__init__(name, age), но я все еще вижу TypeError. Может studentList.append(Student(name, age, major)) проблема? Или это правильно?

Nicholas Renard 10.04.2022 05:56

Эта часть кажется мне правильной. Может быть, вы не сохранили файл, или у вас старая версия кода, или что-то в этом роде?

Jack Taylor 10.04.2022 06:09

О боже... ты прав. Все хорошо. Еще раз спасибо!

Nicholas Renard 10.04.2022 06:11

Кроме того, сообщение об ошибке точно такое же или немного отличается? Возможно, у вас может быть похожая, но немного другая проблема.

Jack Taylor 10.04.2022 06:12

Хорошо, все хорошо. Ницца!

Jack Taylor 10.04.2022 06:12

Если это помогло вам, пожалуйста, отметьте мой ответ как принятый ответ. :)

Jack Taylor 10.04.2022 06:13

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