Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

multiple inheritance python Issue

So I'm currently learning about python's inheritance for one of my classes and the assignment has us use multiple inheritances for the ScientificSwimmer Class. When you try to run the code without creating an object of said class the program runs. However, when creating an object of that class I get the error below. Any advice or solutions would be greatly appreciated. (Line numbers added in post)

#creation of Human class
class Human:  

    def __init__(self, name, age): #talks a name and balance and creates a instance of class
        self.age = age
        self.name = name
    
    def hobby(self):#Hobby method
        print("Likes to watch Netflix")
        
    def info(self):#info method
        print(self.name, " is ", self.age, " years old.")
        

#creation of the Scientist class
class Scienctist(Human):
    
    def __init__(self, name, age, lab):
        super().__init__(name, age)
        self.lab = lab
        
    def hobby(self):
        print("Likes watching Bill Nye the science guy.")
        
    def labName(self):
        print("Works at the ", self.lab , "laboratory.")
        
#Creation of Swimmer Class
class Swimmer(Human):
    
    def __init__(self, name, age, hours):
(line 33)super().__init__(name, age)
        self.hours = hours
        
    def hobby(self):
        print("Likes to go swimming in the lake.")
        
    def SwimmingHours(self):
        print("Swims ", self.hours, "hours per week.")
        
#Creation of the ScientificSwimmer
class ScientificSwimmer(Scienctist, Swimmer):
    def __init__(self, name, age, lab, hours):
(line 58)Scienctist.__init__(self, name, age, lab)
        Swimmer.__init__(self, name, age, hours)

(line 66) person5 = ScientificSwimmer("John Smith", "30", "nuclear", "100")

Error:

File "E:\Python\CS112\lab7\People.py", line 66, in <module>
    person5 = ScientificSwimmer("John Smith", "30", "nuclear", "100")

  File "E:\Python\CS112\lab7\People.py", line 58, in __init__
    Scienctist.__init__(self, name, age, lab)

  File "E:\Python\CS112\lab7\People.py", line 33, in __init__
    super().__init__(name, age)

TypeError: __init__() missing 1 required positional argument: 'hours'
like image 564
Owen Boorn Avatar asked Feb 04 '21 02:02

Owen Boorn


2 Answers

You have to use super() for invoking inherited methods either consistently, or not at all. And you can't use it consistently in cases like this, that involve multiple inheritance and parameter lists that aren't the same as the inherited version of the method. There are probably other solutions, but I'd suggest replacing all super()s with the explicit name of the parent class, as you did in ScientificSwimmer.__init__().

-- comment by jasonharper

like image 121
wjandrea Avatar answered Oct 31 '22 04:10

wjandrea


I would change the classes to add a **kwargs parameter for each one. This is the simplest way of handling the different parameters.

#creation of Human class
class Human:

    def __init__(self, name, age, **kwargs): #talks a name and balance and creates a instance of class
        self.age = age
        self.name = name

    def hobby(self):#Hobby method
        print("Likes to watch Netflix")

    def info(self):#info method
        print(self.name, " is ", self.age, " years old.")


#creation of the Scientist class
class Scienctist(Human):

    def __init__(self, name, age, lab, **kwargs):
        super().__init__(name, age, **kwargs)
        self.lab = lab

    def hobby(self):
        print("Likes watching Bill Nye the science guy.")

    def labName(self):
        print("Works at the ", self.lab , "laboratory.")

#Creation of Swimmer Class
class Swimmer(Human):

    def __init__(self, name, age, hours, **kwargs):
        super().__init__(name, age, **kwargs)
        self.hours = hours

    def hobby(self):
        print("Likes to go swimming in the lake.")

    def SwimmingHours(self):
        print("Swims ", self.hours, "hours per week.")

#Creation of the ScientificSwimmer
class ScientificSwimmer(Scienctist, Swimmer):
    def __init__(self, name, age, lab, hours, **kwargs):
        super().__init__(name=name, age=age, lab=lab, hours=hours, **kwargs)


Output

>>> person5 = ScientificSwimmer("John Smith", "30", "nuclear", "100")
>>> person5
<__main__.ScientificSwimmer at 0x248ca7fb730>

>>> vars(person5)
{'age': '30', 'name': 'John Smith', 'hours': '100', 'lab': 'nuclear'}


like image 22
Eric Truett Avatar answered Oct 31 '22 04:10

Eric Truett