Search code examples
pythonargumentspositional-argument

TypeError: __init__() takes 2 positional arguments but 4 were given


My code is giving the error as TypeError: __init__() takes 2 positional arguments but 4 were given. tried searching for an extra argument but couldn't get one.

Tried previously answered questions but didn't get any proper solution.

My code is as follows:

from abc import ABCMeta, abstractmethod
class Book(object, metaclass=ABCMeta):
    def __init__(self,title,author):
        self.title=title
        self.author=author   
    @abstractmethod
    def display(): pass

#Write MyBook class
class MyBook(Book):
    def __init__(self, price):
        self.price = price

    def display():
        print('Title: {}'.format(title))
        print('Author: {}'.format(author))
        print('Price: {}'.format(price))

title=input()
author=input()
price=int(input())
new_novel=MyBook(title,author,price)
new_novel.display()

compiler gives runtime error as follows

Traceback (most recent call last):
  File "Solution.py", line 23, in <module>
    new_novel=MyBook(title,author,price)
TypeError: __init__() takes 2 positional arguments but 4 were given

Solution

  • Comments inside the code.

    from abc import ABCMeta, abstractmethod
    
    
    class Book(object, metaclass=ABCMeta): # 1. Why do you need meta class?
        def __init__(self, title, author):
            self.title=title
            self.author=author
        @abstractmethod
        def display(self): pass  # 2. Consider replacing with  raise NotImplementedError + missing 'self'
    
    
    class MyBook(Book):
        def __init__(self, price, title, author):  # 3 You are missing two arguments in here.... (title and author)
            super(MyBook, self).__init__(title, author)  # 4 This line is missing
            self.price = price
    
        def display(self):
            print('Title: {}'.format(self.title))  # self missing in all three lines
            print('Author: {}'.format(self.author))
            print('Price: {}'.format(self.price))
    
    title=input()
    author=input()
    price=int(input())
    new_novel = MyBook(title, author, price)
    new_novel.display()