A constructor is a special method in a class that runs automatically when an object is created.
It is used to initialize the object’s properties.
In Python, the constructor is the __init__() method.
🧠 Syntax Reminder:
def __init__(self, ...):
# initialize attributes💡 Example:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 30)
print(p.name) # Output: Alice✅ self refers to the current object (just like this in other languages).
🔍 Real-life Analogy:
The constructor is like the setup crew preparing your hotel room before you check in — it gets everything ready when the "object" (you) arrives.
<div class="infographic-pyctor">
<style>
.infographic-pyctor {
--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;
--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: 680px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-pyctor[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;
}
.infographic-pyctor *, .infographic-pyctor *::before, .infographic-pyctor *::after { box-sizing: border-box; }
.infographic-pyctor .ct-wrap { padding: 0 clamp(1rem, 4vw, 2rem) 1.5rem; }
.infographic-pyctor 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-pyctor .ct-sub { text-align: center; color: var(--ink-soft); font-size: 0.86rem; margin: 0 0 1.3rem; }
.infographic-pyctor .code-block {
font-family: var(--mono-font); font-size: 0.8rem; line-height: 1.75; white-space: pre;
background: var(--paper-alt); border: 1px solid var(--line); border-radius: 8px;
padding: 0.8rem 1rem; margin-bottom: 1.1rem;
}
.infographic-pyctor .code-block .kw { color: var(--c-kw); font-weight: 700; }
.infographic-pyctor .code-block .self { color: var(--c-self); font-weight: 700; }
.infographic-pyctor .code-block .cls { color: var(--accent); font-weight: 700; }
.infographic-pyctor .code-block .active-line { background: var(--accent-soft); border-radius: 3px; }
.infographic-pyctor .input-row { display: flex; justify-content: center; gap: 0.4rem; margin-bottom: 1.1rem; flex-wrap: wrap; }
.infographic-pyctor .input-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-pyctor .input-row input:focus { outline: none; border-color: var(--accent); }
.infographic-pyctor .input-row span { font-family: var(--mono-font); font-size: 0.72rem; color: var(--ink-soft); }
.infographic-pyctor .obj-stage { display: flex; justify-content: center; margin-bottom: 1rem; min-height: 130px; align-items: center; }
.infographic-pyctor .obj-box {
border: 2.5px dashed var(--line); border-radius: 10px; padding: 0.8rem 1.2rem; min-width: 190px; text-align: center;
transition: border-color 0.3s, background 0.3s, border-style 0.3s;
}
.infographic-pyctor .obj-box.is-live { border-style: solid; border-color: var(--accent); background: var(--accent-soft); }
.infographic-pyctor .obj-title { font-family: var(--mono-font); font-size: 0.8rem; font-weight: 700; color: var(--ink-soft); margin-bottom: 0.5rem; }
.infographic-pyctor .obj-box.is-live .obj-title { color: var(--accent); }
.infographic-pyctor .obj-attr {
font-family: var(--mono-font); font-size: 0.78rem; color: var(--ink-soft); margin-bottom: 0.2rem;
opacity: 0.35; transition: opacity 0.25s, color 0.25s;
}
.infographic-pyctor .obj-attr.is-set { opacity: 1; color: var(--ink); font-weight: 700; }
.infographic-pyctor .controls { display: flex; align-items: center; justify-content: center; gap: 0.8rem; margin-bottom: 0.5rem; }
.infographic-pyctor .ctrl-btn {
font: inherit; font-size: 0.82rem; font-weight: 700;
border: 1px solid var(--accent); background: var(--accent); color: #fff;
padding: 0.45rem 1rem; cursor: pointer; border-radius: 4px;
}
.infographic-pyctor .ctrl-btn.secondary { background: var(--paper); color: var(--accent); }
.infographic-pyctor .ctrl-btn:disabled { opacity: 0.4; cursor: default; border-color: var(--line); background: var(--paper-alt); color: var(--ink-soft); }
.infographic-pyctor .step-progress { text-align: center; font-size: 0.72rem; color: var(--ink-soft); margin-bottom: 0.6rem; }
.infographic-pyctor .step-caption { text-align: center; font-size: 0.85rem; color: var(--ink-soft); min-height: 2.2em; }
.infographic-pyctor .step-caption strong { color: var(--ink); font-family: var(--mono-font); }
@media (prefers-reduced-motion: reduce) {
.infographic-pyctor *, .infographic-pyctor *::before, .infographic-pyctor *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="ct-wrap">
<h1>The Constructor</h1>
<p class="ct-sub">__init__ runs automatically the moment you create an object — it's what actually fills it in.</p>
<div class="code-block" id="codeBlock"><span class="kw">class</span> <span class="cls">Dog</span>:
<span class="kw">def</span> __init__(<span class="self">self</span>, name, breed="Unknown"):
<span class="self">self</span>.name = name
<span class="self">self</span>.breed = breed</div>
<div class="input-row">
<span>Dog(</span>
<input id="nameInput" type="text" value="Rex" placeholder="name" />
<span>,</span>
<input id="breedInput" type="text" value="" placeholder="breed (optional)" />
<span>)</span>
</div>
<div class="obj-stage">
<div class="obj-box" id="objBox">
<div class="obj-title" id="objTitle">not created yet</div>
<div class="obj-attr" id="attrName">.name = —</div>
<div class="obj-attr" id="attrBreed">.breed = —</div>
</div>
</div>
<div class="controls">
<button class="ctrl-btn secondary" id="backBtn">Back</button>
<button class="ctrl-btn" id="nextBtn">Next →</button>
<button class="ctrl-btn secondary" id="restartBtn">Restart</button>
</div>
<p class="step-progress" id="stepProgress"></p>
<p class="step-caption" id="stepCaption">Type a name (and optionally a breed), then press Next.</p>
</div>
<script>
(function () {
var root = document.currentScript.closest('.infographic-pyctor')
|| document.querySelector('.infographic-pyctor');
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 nameInput = root.querySelector('#nameInput');
var breedInput = root.querySelector('#breedInput');
var objBox = root.querySelector('#objBox');
var objTitle = root.querySelector('#objTitle');
var attrName = root.querySelector('#attrName');
var attrBreed = root.querySelector('#attrBreed');
var backBtn = root.querySelector('#backBtn');
var nextBtn = root.querySelector('#nextBtn');
var restartBtn = root.querySelector('#restartBtn');
var stepProgress = root.querySelector('#stepProgress');
var stepCaption = root.querySelector('#stepCaption');
var idx = -1;
function buildSteps() {
var name = (nameInput.value || '').trim() || 'Rex';
var rawBreed = (breedInput.value || '').trim();
var usedDefault = rawBreed === '';
var breed = usedDefault ? 'Unknown' : rawBreed;
return [
{
caption: 'd = Dog("' + name + '"' + (usedDefault ? '' : ', "' + breed + '"') + ') — Python first creates a blank, empty Dog object in memory.',
title: 'blank Dog object', live: false, nameSet: false, breedSet: false
},
{
caption: 'Python automatically calls __init__(self, "' + name + '"' + (usedDefault ? ', breed="Unknown" (default used)' : ', "' + breed + '"') + ') on that blank object.',
title: '__init__ running...', live: true, nameSet: false, breedSet: false
},
{
caption: 'self.name = name → the object\'s .name is set.',
title: 'inside __init__', live: true, nameSet: true, breedSet: false, nameVal: name
},
{
caption: 'self.breed = breed → the object\'s .breed is set' + (usedDefault ? ' (falling back to the default, "Unknown").' : '.'),
title: 'inside __init__', live: true, nameSet: true, breedSet: true, nameVal: name, breedVal: breed
},
{
caption: '__init__ finishes. The now-filled object is what d actually points to.',
title: 'd → Dog object', live: true, nameSet: true, breedSet: true, nameVal: name, breedVal: breed, done: true
}
];
}
var steps = buildSteps();
function render() {
var s = idx >= 0 ? steps[idx] : null;
objBox.classList.toggle('is-live', !!(s && s.live));
objTitle.textContent = s ? s.title : 'not created yet';
attrName.classList.toggle('is-set', !!(s && s.nameSet));
attrName.textContent = s && s.nameSet ? '.name = "' + s.nameVal + '"' : '.name = —';
attrBreed.classList.toggle('is-set', !!(s && s.breedSet));
attrBreed.textContent = s && s.breedSet ? '.breed = "' + s.breedVal + '"' : '.breed = —';
stepProgress.textContent = 'Step ' + (idx + 2) + ' of ' + (steps.length + 1);
backBtn.disabled = idx < 0;
nextBtn.disabled = idx >= steps.length - 1;
nextBtn.textContent = idx >= steps.length - 1 ? 'Done' : 'Next →';
stepCaption.innerHTML = s ? s.caption : 'Type a name (and optionally a breed), then press Next.';
}
nextBtn.addEventListener('click', function () {
if (idx < steps.length - 1) { idx++; render(); }
});
backBtn.addEventListener('click', function () {
if (idx > -1) { idx--; render(); }
});
restartBtn.addEventListener('click', function () {
steps = buildSteps();
idx = -1;
render();
});
nameInput.addEventListener('input', function () { steps = buildSteps(); idx = -1; render(); });
breedInput.addEventListener('input', function () { steps = buildSteps(); idx = -1; render(); });
render();
})();
</script>
</div>