J.Doe
J.Doe

Reputation: 31

TypeError: __init__() takes exactly 4 arguments (1 given)

I need help , I have the following classes in Python with inheritance and I have an error:

class Human:

    def __init__(self,name,surname,age):
        self.name = name
        self.surname = surname
        self.age = age

    def getName(self):
        return self.name

    def getSurname(self):
        return self.surname

    def setName(self, name):
        self.name = name

    def setSurname(self, surname):
        self.surname = surname

    def setAge(self, age):
        self.age = age

    def getAge(self):
        return self.age
    pass

and:

from Human import Human

class Student(Human):

    def __init__(self,name,surname,age,file):
        Human().__init__(self,name, surname, file)
        self.file = file

    def getFile(self):
        return self.file

    def setFile(self, file):
        self.file = file

    pass

When I instantiate me the following error

from Student import Student
student1 = Student("Jhon", "Santana", "20", "111000")

Error:

Human().__init__(self, name, surname, age)
TypeError: __init__() takes exactly 4 arguments (1 given)

which is the cause of this error? Thanks...

Upvotes: 2

Views: 2193

Answers (4)

sw123456
sw123456

Reputation: 3459

Try this:

class Human:

    def __init__(self,name,surname,age):
        self.name = name
        self.surname = surname
        self.age = age

    def getName(self):
        return self.name

    def getSurname(self):
        return self.surname

    def setName(self, name):
        self.name = name

    def setSurname(self, surname):
        self.surname = surname

    def setAge(self, age):
        self.age = age

    def getAge(self):
        return self.age


class Student(Human):

    def __init__(self, name,surname,age,file):
        super().__init__(name, surname, age)
        self.file = file

    def getFile(self):
        return self.file

    def setFile(self, file):
        self.file = file


student1 = Student("Jhon", "Santana", "20", "111000")
input()

When you inherit another class but want to overwrite some of the attributes, you need to add the parent class's attributes that you want to overwrite in the super constructor so that the attributes passed into the student class can be passed straight into the parent class.

Feel free to watch my video on inheritance at the following address: https://www.youtube.com/watch?v=cqRtcmPGcic

Upvotes: 2

nluigi
nluigi

Reputation: 1345

As detailed here, the use of super is prefered:

def __init__(self, name, surname, age, file):
    super(Human, self).__init__(name, surname, age)
    self.file = file

Upvotes: 1

Joran Beasley
Joran Beasley

Reputation: 113940

dont instanciate your parent class

def __init__(self,name,surname,age,file):
    Human.__init__(self,name, surname, file)

or even better

 super(Human,self).__init__(name,surname,age)

Upvotes: 2

DorElias
DorElias

Reputation: 2313

Human().__init__(self,name, surname, age)

thats not how you create an instance of your class

you should do:

Human.__init__(self,name, surname, age)

without the () .otherwise you try to create an instance of it in Human()

Upvotes: 3

Related Questions