Python Class Inheritance: How to initialize a subclass with values not in the parent class

25,196

Solution 1

Create a custom initializer on the sub-class and then call the parent class's initializer via super:

class Person(Entity):
    def __init__(self, state, name, age, gender):
        self.gender = gender
        super(Person, self).__init__(state, name, age)

Solution 2

Transitionally, it looks like versions of Py 3.x (not sure which ones) allow this terse version of super():

def __init__(self, state, name, age, gender):
        self.gender = gender
        # Prototype initialization 3.x:
        super().__init__(state, name, age)

Been experimenting with SQLAlchemy models using dataclasses, so when I zipped on by looking at all things Python inheritance, I felt this might extend the answer:

from dataclasses import dataclass

@dataclass
class Entity():
    state: str
    name: str
    age: int

@dataclass
class Person(Entity):
    gender: str

    def describe(self):
        print("State: {state}, Name: {name}, Age: {age}, Gender: {gender}"
            .format(state=self.state, name=self.name, age=self.age, gender=self.gender))

man = Person("human", "humanname", 21, "cisgendered")

man.describe()
Share:
25,196
pez
Author by

pez

Updated on July 05, 2022

Comments

  • pez
    pez almost 2 years

    I'm trying to learn more about classes and OOP.

    How can I have my Person class initialize with all the values of Entity but also with a value that may not be contained in the Entity class?

    For example, both Person and Spirit inherit from Entity. However, only a Person would have a gender. How can I have Person initialize with gender as well?

    After that, would I still be able to create an instance of Person and call describe() in the same way I've done below?

    class Entity(object):
    
        def __init__(self, state, name, age):
            self.state = state
            self.name = name
            self.age = age
    
    class Person(Entity):
    
        def describe(self):
            print "Identification: %s, %s, %s." % (self.state, self.name, self.age)
    
    class Spirit(Entity):
        pass  # for now
    
    steve = Person("human", "Steve", "23" # can I then list gender here?)
    steve.describe()