Inheritance allows one class to reuse the properties and methods of another class.
Parent class (Base): The class being inherited from.
Child class (Derived): The class that inherits.
💡 Example:
class Animal:
def speak(self):
print("Some sound")
class Dog(Animal):
def bark(self):
print("Woof")
pet = Dog()
pet.speak() # Inherited from Animal
pet.bark() # Defined in DogSome sound
Woof🔍 Why Use Inheritance?
✅ Promotes code reuse
✅ Supports hierarchical organization
✅ Helps in extending functionality without rewriting
🌐 Real-life Analogy:
A child inherits traits from a parent – like eye color or height.
Similarly, a class can inherit behavior and properties from another class.
🧪 Bonus Example:
class Vehicle:
def start(self):
print("Vehicle started")
class Car(Vehicle):
def drive(self):
print("Car is driving")
tesla = Car()
tesla.start() # from Vehicle
tesla.drive() # from Car<div class="infographic-pyinherit">
<style>
.infographic-pyinherit {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--c-kw: #7c3aed; --c-kw-soft: #ede9fe;
--c-self: #b45309; --c-self-soft: #fdf0dc;
--ovr: #1f9d55; --ovr-soft: #e3f5ec;
--inh: #9333ea; --inh-soft: #f3e8fd;
--mono-font: 'IBM Plex Mono', 'SFMono-Regular', Menlo, monospace;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
box-sizing: border-box;
max-width: 720px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-pyinherit[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--c-kw: #a78bfa; --c-kw-soft: #2c2140;
--c-self: #e0a458; --c-self-soft: #3a2c14;
--ovr: #6fdc8c; --ovr-soft: #16342a;
--inh: #c58af2; --inh-soft: #2e2140;
}
.infographic-pyinherit *, .infographic-pyinherit *::before, .infographic-pyinherit *::after { box-sizing: border-box; }
.infographic-pyinherit .ih-wrap { padding: 0 clamp(1rem, 4vw, 2rem) 1.5rem; }
.infographic-pyinherit h1 {
font-family: var(--display-font); font-weight: 600;
font-size: clamp(1.5rem, 5vw, 2.05rem); text-align: center; margin: 1.5rem 0 0.25rem; letter-spacing: -0.01em;
}
.infographic-pyinherit .ih-sub { text-align: center; color: var(--ink-soft); font-size: 0.86rem; margin: 0 0 1.3rem; }
.infographic-pyinherit .code-block {
font-family: var(--mono-font); font-size: 0.78rem; line-height: 1.7; white-space: pre;
background: var(--paper-alt); border: 1px solid var(--line); border-radius: 8px;
padding: 0.8rem 1rem; margin-bottom: 1.2rem;
}
.infographic-pyinherit .code-block .kw { color: var(--c-kw); font-weight: 700; }
.infographic-pyinherit .code-block .self { color: var(--c-self); font-weight: 700; }
.infographic-pyinherit .code-block .cls { color: var(--accent); font-weight: 700; }
.infographic-pyinherit .code-block .method-span { border-radius: 4px; padding: 0 0.15rem; transition: background 0.3s, box-shadow 0.3s; }
.infographic-pyinherit .code-block .method-span.is-active-ovr { background: var(--ovr-soft); box-shadow: 0 0 0 1.5px var(--ovr); }
.infographic-pyinherit .code-block .method-span.is-active-base { background: var(--accent-soft); box-shadow: 0 0 0 1.5px var(--accent); }
.infographic-pyinherit .code-block .method-span.is-active-inh { background: var(--inh-soft); box-shadow: 0 0 0 1.5px var(--inh); }
.infographic-pyinherit .factory-row { display: flex; justify-content: center; gap: 0.4rem; margin-bottom: 0.7rem; flex-wrap: wrap; }
.infographic-pyinherit .cls-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.8rem; font-weight: 700;
background: var(--paper-alt); border: 1.5px solid var(--line); color: var(--ink-soft);
padding: 0.4rem 0.7rem; cursor: pointer; border-radius: 6px;
}
.infographic-pyinherit .cls-btn.is-selected { border-color: var(--accent); color: var(--accent); background: var(--accent-soft); }
.infographic-pyinherit .factory-row input {
font-family: var(--mono-font); font-size: 0.82rem; padding: 0.4rem 0.6rem;
border: 1.5px solid var(--line); border-radius: 5px; background: var(--paper-alt); color: var(--ink); width: 110px;
text-align: center;
}
.infographic-pyinherit .factory-row input:focus { outline: none; border-color: var(--accent); }
.infographic-pyinherit .create-row { display: flex; justify-content: center; margin-bottom: 0.5rem; }
.infographic-pyinherit .create-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.82rem; font-weight: 700;
background: var(--accent); color: #fff; border: none; border-radius: 999px;
padding: 0.5rem 1.1rem; cursor: pointer;
}
.infographic-pyinherit .create-btn:disabled { opacity: 0.5; cursor: default; }
.infographic-pyinherit .clear-row { display: flex; justify-content: center; margin-bottom: 1.1rem; }
.infographic-pyinherit .clear-btn {
font: inherit; font-size: 0.78rem; font-weight: 600; color: var(--ink-soft);
background: none; border: 1px solid var(--line); padding: 0.35rem 0.75rem; cursor: pointer; border-radius: 999px;
}
.infographic-pyinherit .obj-grid { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.8rem; margin-bottom: 1rem; }
.infographic-pyinherit .obj-card {
border: 2px solid var(--line); background: var(--paper-alt); border-radius: 10px;
padding: 0.8rem 0.9rem; min-width: 170px; animation: ih-pop-in 0.3s ease; transition: border-color 0.25s;
}
@keyframes ih-pop-in { from { opacity: 0; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } }
.infographic-pyinherit .obj-title { font-family: var(--mono-font); font-size: 0.78rem; font-weight: 700; margin-bottom: 0.5rem; text-align: center; color: var(--ink); }
.infographic-pyinherit .obj-call-btn {
display: block; width: 100%;
font: inherit; font-family: var(--mono-font); font-size: 0.74rem; font-weight: 700;
background: var(--paper); color: var(--accent); border: 1.5px solid var(--accent); border-radius: 6px;
padding: 0.32rem 0.5rem; cursor: pointer;
}
.infographic-pyinherit .obj-result { font-family: var(--mono-font); font-size: 0.73rem; color: var(--ink-soft); margin-top: 0.4rem; min-height: 2.4em; text-align: center; }
.infographic-pyinherit .obj-result .src-tag { display: block; font-weight: 700; margin-top: 0.15rem; }
.infographic-pyinherit .obj-result .src-tag.ovr { color: var(--ovr); }
.infographic-pyinherit .obj-result .src-tag.inh { color: var(--inh); }
.infographic-pyinherit .obj-result .src-tag.base { color: var(--accent); }
.infographic-pyinherit .ih-caption { text-align: center; font-size: 0.85rem; color: var(--ink-soft); }
.infographic-pyinherit .ih-caption strong { color: var(--ink); font-family: var(--mono-font); }
@media (prefers-reduced-motion: reduce) {
.infographic-pyinherit *, .infographic-pyinherit *::before, .infographic-pyinherit *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="ih-wrap">
<h1>Inheritance</h1>
<p class="ih-sub">A child class gets everything from its parent — for free, until it decides to override.</p>
<div class="code-block">
<span class="kw">class</span> <span class="cls">Animal</span>:
<span class="kw">def</span> __init__(<span class="self">self</span>, name):
<span class="self">self</span>.name = name
<span class="kw">def</span> <span class="method-span" id="mAnimal">speak(self)</span>:
<span class="kw">return</span> f"{<span class="self">self</span>.name} makes a sound"
<span class="kw">class</span> <span class="cls">Dog</span>(<span class="cls">Animal</span>):
<span class="kw">def</span> <span class="method-span" id="mDog">speak(self)</span>: <span style="color:var(--ovr); font-weight:700;"># overrides</span>
<span class="kw">return</span> f"{<span class="self">self</span>.name} says Woof!"
<span class="kw">class</span> <span class="cls">Cat</span>(<span class="cls">Animal</span>):
<span class="method-span" id="mCat">pass</span> <span style="color:var(--inh); font-weight:700;"># inherits speak() as-is</span></div>
<div class="factory-row">
<button class="cls-btn is-selected" data-cls="Animal">Animal</button>
<button class="cls-btn" data-cls="Dog">Dog</button>
<button class="cls-btn" data-cls="Cat">Cat</button>
</div>
<div class="factory-row">
<input id="nameInput" type="text" value="Rex" placeholder="name" />
</div>
<div class="create-row"><button class="create-btn" id="createBtn">Create: Dog("Rex")</button></div>
<div class="clear-row"><button class="clear-btn" id="clearBtn">↺ Clear all objects</button></div>
<div class="obj-grid" id="objGrid"></div>
<p class="ih-caption" id="ihCaption">Create a few and call speak() on each — watch which class's code actually lights up.</p>
</div>
<script>
(function () {
var root = document.currentScript.closest('.infographic-pyinherit')
|| document.querySelector('.infographic-pyinherit');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) root.setAttribute('data-theme', 'dark');
var clsBtns = root.querySelectorAll('.cls-btn');
var nameInput = root.querySelector('#nameInput');
var createBtn = root.querySelector('#createBtn');
var clearBtn = root.querySelector('#clearBtn');
var objGrid = root.querySelector('#objGrid');
var ihCaption = root.querySelector('#ihCaption');
var mAnimal = root.querySelector('#mAnimal');
var mDog = root.querySelector('#mDog');
var mCat = root.querySelector('#mCat');
var currentCls = 'Animal';
var MAX_OBJS = 4;
var objCount = 0;
var speakInfo = {
Animal: { text: function (n) { return n + ' makes a sound'; }, source: 'Animal.speak()', tag: 'base', el: mAnimal, hlClass: 'is-active-base' },
Dog: { text: function (n) { return n + ' says Woof!'; }, source: 'Dog.speak() (override)', tag: 'ovr', el: mDog, hlClass: 'is-active-ovr' },
Cat: { text: function (n) { return n + ' makes a sound'; }, source: 'Animal.speak() (inherited)', tag: 'inh', el: mAnimal, hlClass: 'is-active-inh' }
};
function updateCreateBtn() {
var n = (nameInput.value || '').trim() || 'Rex';
createBtn.textContent = 'Create: ' + currentCls + '("' + n + '")';
createBtn.disabled = objCount >= MAX_OBJS;
}
clsBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
clsBtns.forEach(function (b) { b.classList.toggle('is-selected', b === btn); });
currentCls = btn.dataset.cls;
updateCreateBtn();
});
});
nameInput.addEventListener('input', updateCreateBtn);
function clearHighlights() {
[mAnimal, mDog, mCat].forEach(function (el) {
el.classList.remove('is-active-ovr', 'is-active-base', 'is-active-inh');
});
}
function addObject() {
if (objCount >= MAX_OBJS) return;
var name = (nameInput.value || '').trim() || 'Rex';
objCount++;
var varName = 'obj' + objCount;
var cls = currentCls;
var card = document.createElement('div');
card.className = 'obj-card';
card.innerHTML =
'<div class="obj-title">' + varName + ' = ' + cls + '("' + name + '")</div>' +
'<button class="obj-call-btn">call ' + varName + '.speak()</button>' +
'<div class="obj-result"></div>';
objGrid.appendChild(card);
var btnEl = card.querySelector('.obj-call-btn');
var resultEl = card.querySelector('.obj-result');
btnEl.addEventListener('click', function () {
clearHighlights();
var info = speakInfo[cls];
info.el.classList.add(info.hlClass);
resultEl.innerHTML = '"' + info.text(name) + '"<span class="src-tag ' + info.tag + '">via ' + info.source + '</span>';
ihCaption.innerHTML = cls === 'Cat'
? '<strong>Cat</strong> has no speak() of its own — Python walks up to <strong>Animal</strong> and uses that one.'
: (cls === 'Dog'
? '<strong>Dog</strong> defines its own speak() — it overrides Animal\'s version completely.'
: '<strong>Animal</strong> is the base — this is the original speak().');
});
updateCreateBtn();
}
createBtn.addEventListener('click', addObject);
clearBtn.addEventListener('click', function () {
objGrid.innerHTML = '';
objCount = 0;
clearHighlights();
updateCreateBtn();
ihCaption.textContent = 'Create a few and call speak() on each — watch which class\'s code actually lights up.';
});
updateCreateBtn();
})();
</script>
</div>