In [25]:
class Director:
    
    def __init__(self, name):
        self.name = name
        self.directed_movies = set()
        self.facebook_likes = 0
        
    def get_movies(self):
        return self.directed_movies
    
class Actor:
    
    def __init__(self, name):
        self.name = name
        self.costars = {}
        self.filmography = set()
        self.facebook_likes = 0
        
    def get_costars(self):
        return self.costars
    
    def __str__(self):
        return self.name
    
    def get_filmography(self):
        return self.filmography
    
    def get_total_gross(self):
        total_gross = 0
        for movie in self.filmography:
            if ( movie.gross != None ):
                total_gross += movie.gross
                
        return total_gross
    
    def get_mean_gross(self):
        total = self.get_total_gross()
        return total / len(self.filmography)
In [26]:
class ActorDirector(Actor,Director):
    
    def __init__(self, name):
        super().__init__(name)
In [27]:
ad = ActorDirector("Ben Affleck")
In [28]:
ad.name
Out[28]:
'Ben Affleck'
In [29]:
print(ad)
Ben Affleck
In [30]:
ad.filmography
Out[30]:
set()
In [31]:
ad.get_movies
Out[31]:
<bound method Director.get_movies of <__main__.ActorDirector object at 0x10c573a90>>
In [33]:
ad.get_movies()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-33-4f567e4d1248> in <module>()
----> 1 ad.get_movies()

<ipython-input-25-064b8b242090> in get_movies(self)
      7 
      8     def get_movies(self):
----> 9         return self.directed_movies
     10 
     11 class Actor:

AttributeError: 'ActorDirector' object has no attribute 'directed_movies'
In [34]:
class ActorDirectorV2(Actor,Director):
    
    def __init__(self, name):
        Actor.__init__(self, name)
        Director.__init__(self, name)
In [35]:
adV2 = ActorDirectorV2("Ben Affleck")
In [36]:
adV2.name
Out[36]:
'Ben Affleck'
In [37]:
adV2.get_movies()
Out[37]:
set()

Fixing Multiple Inheritance

In [38]:
class A:
    def __init__(self):
        print("In A...")
        
class B:
    def __init__(self):
        print("In B...")
        
class C(A, B):
    def __init__(self):
        super().__init__()
        print("In C...")
        
testC = C()
In A...
In C...
In [40]:
class A:
    def __init__(self):
        super().__init__() #### LOOK HERE <--------------
        print("In A...")
        
class B:
    def __init__(self):
        super().__init__() #### LOOK HERE <--------------
        print("In B...")
        
class C(B, A):
    def __init__(self):
        super().__init__()
        print("In C...")
        
testC = C()
In A...
In B...
In C...
In [44]:
class Director:
    
    def __init__(self, name=""):
        super().__init__() #### LOOK HERE <--------------
        print("Director init...")
        self.name = name
        self.directed_movies = set()
        self.facebook_likes = 0
        
    def get_movies(self):
        return self.directed_movies
    
class Actor:
    
    def __init__(self, name):
        super().__init__() #### LOOK HERE <--------------
        print("actor init...")
        self.name = name
        self.costars = {}
        self.filmography = set()
        self.facebook_likes = 0
        
    def get_costars(self):
        return self.costars
    
    def __str__(self):
        return self.name
    
    def get_filmography(self):
        return self.filmography
    
    def get_total_gross(self):
        total_gross = 0
        for movie in self.filmography:
            if ( movie.gross != None ):
                total_gross += movie.gross
                
        return total_gross
    
    def get_mean_gross(self):
        total = self.get_total_gross()
        return total / len(self.filmography)
    
class ActorDirector(Actor,Director):
    
    def __init__(self, name):
        super().__init__(name)    
In [45]:
ad = ActorDirector("Ben Affleck")
ad.filmography
Director init...
actor init...
Out[45]:
set()

Attempt #2

In [46]:
class Person:
    
    def __init__(self, name):
        self.name = name

class Director(Person):
    
    def __init__(self, name):
        super().__init__(name) #### LOOK HERE <--------------
        print("Director init...")
        self.directed_movies = set()
        self.facebook_likes = 0
        
    def get_movies(self):
        return self.directed_movies
    
class Actor(Person):
    
    def __init__(self, name):
        super().__init__(name) #### LOOK HERE <--------------
        print("actor init...")
        self.costars = {}
        self.filmography = set()
        self.facebook_likes = 0
        
    def get_costars(self):
        return self.costars
    
    def __str__(self):
        return self.name
    
    def get_filmography(self):
        return self.filmography
    
    def get_total_gross(self):
        total_gross = 0
        for movie in self.filmography:
            if ( movie.gross != None ):
                total_gross += movie.gross
                
        return total_gross
    
    def get_mean_gross(self):
        total = self.get_total_gross()
        return total / len(self.filmography)
    
class ActorDirector(Actor,Director):
    
    def __init__(self, name):
        super().__init__(name)    
In [47]:
ad = ActorDirector("Ben Affleck")
ad.name
Director init...
actor init...
Out[47]:
'Ben Affleck'
In [48]:
ad.filmography
Out[48]:
set()
In [49]:
ad.directed_movies
Out[49]:
set()
In [ ]: