Python Class Inheritance: How to initialize a subclass with values not in the parent class
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()
pez
Updated on July 05, 2022Comments
-
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 ofEntity
but also with a value that may not be contained in theEntity
class?For example, both
Person
andSpirit
inherit fromEntity
. However, only aPerson
would have agender
. How can I havePerson
initialize withgender
as well?After that, would I still be able to create an instance of
Person
and calldescribe()
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()