How to set and get a parent class attribute from an inherited class in Python?

Question:

I have the Family and its inherited Person classes. How do I get the familyName attribute from the Person class?

class Family(object):
    def __init__(self, familyName):
        self.familyName = familyName

class Person(Family):
    def __init__(self, personName):
        self.personName = personName

For instance, let these Family and Person objects:

strauss = Family('Strauss')
johaness = Person('Johaness')
richard = Person('Richard')

I’d like to do something such as:

print richard.familyName

and get 'Strauss'. How can I do this?

Asked By: msampaio

||

Answers:

You cannot.

Instances only inherit the parent class methods and attributes, not instance attributes. You should not confuse the two.

strauss.familyName is an instance attribute of a Family instance. The Person instances would have their own copies of the familyName attribute.

You normally would code the Person constructor to take two arguments:

class Person(Family):
    def __init__(self, personName, familyName):
        super(Person, self).__init__(familyName)
        self.personName = personName

johaness = Person('Johaness', 'Strauss')
richard = Person('Richard', 'Strauss')

An alternative approach would be for Person to hold a reference to a Family instance:

class Person(object):
    def __init__(self, personName, family):
        self.personName = personName
        self.family = family

where Person no longer inherits from Family. Use it like:

strauss = Family('Strauss')
johaness = Person('Johaness', strauss)
richard = Person('Richard', strauss)

print johaness.family.familyName
Answered By: Martijn Pieters

In addition to Martijns suggestions, you can also create the Person from the Family instance, that way letting the family keep track of it’s members:

class Person(object):
    def __init__(self, person_name, family):
        self.person_name = person_name
        self.family = family

    def __str__(self):
        return ' '.join((self.person_name, self.family.family_name))

class Family(object):
    def __init__(self, family_name):
        self.family_name = family_name
        self.members = []

    def add_person(self, person_name):
        person = Person(person_name, self)
        self.members.append(person)
        return person

    def __str__(self):
        return 'The %s family: ' % self.family_name + ', '.join(str(x) for x in self.members)

Usage like this:

>>> strauss = Family('Strauss')
>>> johannes = strauss.add_person('Johannes')
>>> richard = strauss.add_person('Richard')
>>> 
>>> print johannes
Johannes Strauss
>>> print richard
Richard Strauss
>>> print strauss
The Strauss family: Johannes Strauss, Richard Strauss
Answered By: Lennart Regebro
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.