How to get classes to inherit the attributes of their parent classes?

Question:

I am trying to get classes to inherit attributes of the parent class.

The main class is Country and has two attributes that’re the country’s capital and president.

The class State is derived from Country, and should have the attributes of the state’s capital and the governor.

The class County is derived from State, and should have the attribute of the county’s name.

I have a pretty basic understanding of classes, any help would be greatly appreciated.

Here is the code I have:
Note: Nothing underneath if name = ‘main’: can change

class Country:
    def __init__(self, country_capital, president):
        self.country_capital = country_capital
        self.president = president

class State(Country):
    def __init__(self, state_capital, governor, c):
        self.state_capital = state_capital
        self.governor = governor
        c = Country()


class County(State):
    def __init__(self, county_seat, c):
        self.county_seat = county_seat
        c = State()
        self.governor = super().__init__(self, state_capital)


if __name__ == '__main__':
    United_States = Country("Washington, DC", "Joe Biden")
    Kentucky = State("Frankfort", "Andy Beshear", United_States)
    Jefferson = County("Louisville", Kentucky)
    print("County seat: ", Jefferson.county_seat)
    print(" Governor: ", Jefferson.governor)
    print("State capital: ", Jefferson.state_capital)
    print("Country capital: ", Jefferson.country_capital)
    print("President:", Jefferson.president)
Asked By: Peter Nguyen

||

Answers:

You need to initialize the superclass in the constructor like this:

class Country:
    def __init__(self, country_capital, president):
        self.country_capital = country_capital
        self.president = president

class State(Country):
    def __init__(self, state_capital, governor, country_capital, president):
        super().__init__(country_capital, president)
        self.state_capital = state_capital
        self.governor = governor
       
class County(State):
    def __init__(self, county_seat, state_capital, governor, country_capital, president):
        super().__init__(self, state_capital, governor, country_capital, president)
        self.county_seat = county_seat

However, this is not really a natural use of inheritance. You might consider just storing a State as an attribute of a County, rather than its superclass. Same with State and Country.

Answered By: jprebys

When using inheritance, we should employ the "is a" mentality. This doesn’t quite make sense with your code because a State is not a Country and so it wouldn’t have the same attributes.

You should be using attributes to signify that a State has a country that is a part of (like you have)

To answer your question, using super(). __init__() will initialize the same attributes as the parent, provided they are initialized in the parent’s constructor.

Answered By: Zack Walton

Since you’re constructing the "parent" object separately from the "child", I might suggest composition rather than inheritance. Note that inheritance implies an "is a" relationship rather than an "has a" relationship — is it correct to say that a State is a Country, or that a State has a Country that it is in?

class Country:
    def __init__(self, capital: str, president: str):
        self.capital = capital
        self.president = president

class State:
    def __init__(self, capital: str, governor: str, country: Country):
        self.capital = capital
        self.governor = governor
        self.country = country

class County:
    def __init__(self, seat: str, state: State):
        self.seat = seat
        self.state = state
        self.country = state.country

if __name__ == '__main__':
    United_States = Country("Washington, DC", "Joe Biden")
    Kentucky = State("Frankfort", "Andy Beshear", United_States)
    Jefferson = County("Louisville", Kentucky)
    print("County seat: ", Jefferson.seat)
    print("Governor: ", Jefferson.state.governor)
    print("State capital: ", Jefferson.state.capital)
    print("Country capital: ", Jefferson.country.capital)
    print("President:", Jefferson.country.president)
Answered By: Samwise
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.