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
, age
和 major
)。这就是您在错误消息中看到 missing 2 required positional arguments: 'age' and 'major'
的原因。
但是,看起来您实际上是在尝试调用父 class 的 __init__
方法。你会这样做:
super().__init__(name, age)
请注意,我没有指定 major
参数,因为 Person
class 不接受此参数。此外,Person
class 的 __init__
方法已经存储了 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
这可能有点冗长,但我对导入 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
, age
和 major
)。这就是您在错误消息中看到 missing 2 required positional arguments: 'age' and 'major'
的原因。
但是,看起来您实际上是在尝试调用父 class 的 __init__
方法。你会这样做:
super().__init__(name, age)
请注意,我没有指定 major
参数,因为 Person
class 不接受此参数。此外,Person
class 的 __init__
方法已经存储了 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