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
...