It is definitely not good to inherint Child from Parent or Parent from Child.
The correct way to do it is to make a base class, let's say Person and inherit both Child and Parent from it.
An advantage of doing this is to remove code repetition, at the moment you have only firstname / lastname fields copied into both objects, but you may have more data or additional methods, like get_name()
to work with this data.
Here is an example:
class Person:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def get_name(self):
return f"{self.firstname} {self.lastname}"
class Parent(Person):
def __init__(self, firstname, lastname):
super().__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().__init__(firstname, parent.lastname)
self.parent = parent
Another way of doing this is to do it without inheritance, but only have one Person object (vs Parent and Child).
The feature of tracking family status and parents / children can be moved into another object.
An advantage of this approach is that you follow the single responsibility principle and keep objects simple, each object does only one thing.
Here is an example:
from collections import defaultdict
class Person:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def get_name(self):
return f"{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("{} 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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…