Define a Course base class with attributes number and title. Define a print_info() method that displays the course number and title.
Also define a derived class OfferedCourse with the additional attributes instructor_name, term, and class_time.
Ex: If the input is:
ECE287
Digital Systems Design
ECE387
Embedded Systems Design
Mark Patterson
Fall 2018
WF: 2-3:30 pm
the output is:
Course Information:
Course Number: ECE287
Course Title: Digital Systems Design
Course Information:
Course Number: ECE387
Course Title: Embedded Systems Design
Instructor Name: Mark Patterson
Term: Fall 2018
Class Time: WF: 2-3:30 pm
Here is the code I have so far:
class Course:
# TODO: Define constructor with attributes: number, title
def __init__(self):
self.number = ''
self.title = 0
# TODO: Define print_info()
def print_info(self):
print(' Course Number:', self.number)
print(' Title:', self.title)
class OfferedCourse(Course):
# TODO: Define constructor with attributes:
# number, title, instructor_name, term, class_time
def __init__(self, number, title, instructor_name, term, class_time):
Course.__init__(course_number, course_title)
self.instructor_name = ''
self.term = ''
self.class_time = 0
if __name__ == '__main__':
course_number = input()
course_title = input()
o_course_number = input()
o_course_title = input()
instructor_name = input()
term = input()
class_time = input()
my_course = Course(course_number, course_title)
my_course.print_info()
my_offered_course = OfferedCourse(
o_course_number, o_course_title, instructor_name, term, class_time
)
my_offered_course.print_info()
print(' Instructor Name:', my_offered_course.instructor_name)
print(' Term:', my_offered_course.term)
print(' Class Time:', my_offered_course.class_time)
When I run the code, I'm getting the following error:
Traceback (most recent call last): File "main.py", line 32, in <module> my_course = Course(course_number, course_title) TypeError: __init__() takes 1 positional argument but 3 were given
CodePudding user response:
The thing is with the def __init__(self): method in the Course class. Here you are telling python that the class Course does not receive anything else than itself. If you want to be able to pass those arguments to init, but keep the default values, you can provide a default value inside init
def __init__(self, number: int = 0, title:str = ''):
self.number = number
self.title = title
CodePudding user response:
Course.__init__ is an ordinary function, not a bound method, so you need to pass self explicitly:
class OfferedCourse(Course):
# TODO: Define constructor with attributes:
# number, title, instructor_name, term, class_time
def __init__(self, number, title, instructor_name, term, class_time):
Course.__init__(self, course_number, course_title)
self.instructor_name = ''
self.term = ''
self.class_time = 0
or, you use super().__init__ and let self be passed implicitly via a bit of compiler-implemented magic.
class OfferedCourse(Course):
# TODO: Define constructor with attributes:
# number, title, instructor_name, term, class_time
def __init__(self, number, title, instructor_name, term, class_time):
super().__init__(course_number, course_title)
self.instructor_name = ''
self.term = ''
self.class_time = 0
Either way, you need Course.__init__ to accept the arguments you are passing from OfferedCourse.__init__:
class Course:
def __init__(self, number='', title=0):
self.number = number
self.title = title
...
class OfferedCourse(Course):
# TODO: Define constructor with attributes:
# number, title, instructor_name, term, class_time
def __init__(self, number, title, instructor_name='', term='', class_time=0):
super().__init__(number, title)
self.instructor_name = instructor_name
self.term = term
self.class_time = class_time
...
