It is definitely not good to inherit a child from a parent or parent from a child.
The right way to do this is to create a base class, say, Person, and inherit both Child and Parent from it. The advantage of this is to remove code repetition, at the moment you only have the first and last name fields copied to both objects, but you can have more data or additional methods like get_name() to work with this data.
Here is an example:
class Person(object): def __init__(self, firstname, lastname): self.firstname = firstname self.lastname = lastname def get_name(self): return '%s %s' % (self.firstname, self.lastname) class Parent(Person): def __init__(self, firstname, lastname): super(Parent, self).__init__(firstname, lastname) self.kids = [] def havechild(self, firstname): print self.firstname, "is having a child" self.kids.append(Child(self, firstname)) class Child(Person): def __init__(self, parent, firstname): super(Child, self).__init__(firstname, parent.lastname) self.parent = parent
Another way to do this is to do it without inheritance, but to have only one Person object (against Parent and Child). The function of tracking the status of the family and parents / children can be transferred to another object.
The advantage of this approach is that you follow the principle of shared responsibility and make objects simple, each object does only one thing.
Here is an example:
from collections import defaultdict class Person(object): def __init__(self, firstname, lastname): self.firstname = firstname self.lastname = lastname def get_name(self): return '%s %s' % (self.firstname, self.lastname) class FamilyRegistry(object): def __init__(self): self.kids = defaultdict(list) def register_birth(self, parent, child_name): print parent.firstname, "is having a child" child = Person(child_name, parent.lastname) self.kids[parent.lastname].append(child) return child def print_children(self, person): children = self.kids[person.lastname] if len(children) == 0: print '%s has no children' % person.get_name() return for child in children: print child.get_name()
It works like this:
joe = Person('Joe', 'Black') jill = Person('Jill', 'White') registry = FamilyRegistry() registry.register_birth(joe, 'Joe Junior') # Joe is having a child registry.register_birth(joe, 'Tina') # Joe is having a child registry.print_children(joe) # Joe Junior Black # Tina Black registry.print_children(jill) # Jill White has no children