Home > OS >  I'm not sure what I'm doing wrong on this program
I'm not sure what I'm doing wrong on this program

Time:11-28

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

    ...
  • Related