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

前端 未结 2 1309
耶瑟儿~
耶瑟儿~ 2020-12-08 20:15

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

相关标签:
2条回答
  • 2020-12-08 20:56

    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
    
    0 讨论(0)
  • 2020-12-08 20:58

    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
    
    0 讨论(0)
提交回复
热议问题