Это может быть немного длинно, но я не могу импортировать родительский и дочерний классы.
У меня такое чувство, что я неправильно использую заглавные буквы при применении имен классов. Я получаю сообщение об ошибке:
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.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))
проблема? Или это правильно?
Эта часть кажется мне правильной. Может быть, вы не сохранили файл, или у вас старая версия кода, или что-то в этом роде?
О боже... ты прав. Все хорошо. Еще раз спасибо!
Кроме того, сообщение об ошибке точно такое же или немного отличается? Возможно, у вас может быть похожая, но немного другая проблема.
Хорошо, все хорошо. Ницца!
Если это помогло вам, пожалуйста, отметьте мой ответ как принятый ответ. :)
Почему ты звонишь
Student(Person).__init__(self, name, age, major)
внутрьStudent.__init__
? Вы, наверное, хотите вызватьsuper().__init__(name, age)
, а затемself.major = major
.