I have the Family
and its inherited Person
classes. How do I get the familyName
attribute from the Person
class?
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
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