-2

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
accdias
  • 5,160
  • 3
  • 19
  • 31
Jay
  • 1
  • Thanks for following up with my question. I got this error message: Traceback (most recent call last): File "main.py", line 32, in my_course = Course(course_number, course_title) TypeError: __init__() takes 1 positional argument but 3 were given – Jay Nov 27 '22 at 21:28
  • 2
    In your `__init__` for `Course`, why not add the arguments that you want your course objects to receive? In other words -- add a title and a number to the constructor. – John Coleman Nov 27 '22 at 21:33
  • You still have to do what it says: `TODO define constructor with attributes: ...` – mkrieger1 Nov 27 '22 at 21:36
  • And use them inside `__init__`, i.e. in `OfferedCourse` there are argument in the method signature, but you never use `term`, `class_time` – buran Nov 27 '22 at 21:37
  • 1
    If you call `Course.__init__` explicitly, you need to pass `self` to it as well. Or, use `super().__init__`, in which case you *don't* pass `self` explicitly. – chepner Nov 27 '22 at 21:37
  • Ok, I will try the feedback provided and see if I can figure it out. New to this so it takes me sometime to get it together – Jay Nov 27 '22 at 21:41

2 Answers2

0

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
  • Given that course numbers is alphanumeric string like `ECE287` do you really suggest type annotation `int`? – buran Nov 27 '22 at 21:39
0

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

    ...
chepner
  • 497,756
  • 71
  • 530
  • 681
  • when it says course__int is not defined, I'm not sure what else to change because it's defined in the code from what I can tell. Should it be my_offered_class time : 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 – Jay Nov 27 '22 at 22:00