1️⃣ Instance Method
An instance method works with the data of a specific object.
It takes self as its first parameter.
class Student:
def __init__(self, name):
self.name = name
def greet(self):
return f"Hello {self.name}"
student = Student("Codeveda")
print(student.greet()) #Hello CodevedaHere, self refers to the current object.
🧠 Instance Method
self → Current objectUse it when the method needs to access or modify instance variables.
2️⃣ Class Method
A class method works with the class itself rather than a particular object.
It uses the @classmethod decorator and takes cls as its first parameter.
class Student:
school = "ABC School"
@classmethod
def change_school(cls, name):
cls.school = name
Student.change_school("XYZ School")
print(Student.school) #XYZ SchoolHere, cls refers to the class.
🧠 Class Method
cls → ClassUse it when the method needs to access or modify class variables.
3️⃣ Static Method
A static method doesn't need access to either the object or the class.
It uses the @staticmethod decorator.
class Calculator:
@staticmethod
def add(a, b):
return a + b
print(Calculator.add(10, 5)) #15It doesn't use self or cls.
<div class="infographic-pymethods">
<style>
.infographic-pymethods {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--c-inst: #2563eb; --c-inst-soft: #e3ebfd;
--c-cls: #9333ea; --c-cls-soft: #f3e8fd;
--c-static: #b45309; --c-static-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: 740px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-pymethods[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--c-inst: #5b8def; --c-inst-soft: #202942;
--c-cls: #c58af2; --c-cls-soft: #2e2140;
--c-static: #e0a458; --c-static-soft: #3a2c14;
}
.infographic-pymethods *, .infographic-pymethods *::before, .infographic-pymethods *::after { box-sizing: border-box; }
.infographic-pymethods .mt-wrap { padding: 0 clamp(1rem, 4vw, 2rem) 1.5rem; }
.infographic-pymethods h1 {
font-family: var(--display-font); font-weight: 600;
font-size: clamp(1.4rem, 5vw, 1.9rem); text-align: center; margin: 1.5rem 0 0.25rem; letter-spacing: -0.01em;
}
.infographic-pymethods .mt-sub { text-align: center; color: var(--ink-soft); font-size: 0.85rem; margin: 0 0 1.3rem; }
.infographic-pymethods .mt-tabs { display: flex; justify-content: center; gap: 0.35rem; margin-bottom: 1.4rem; border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.infographic-pymethods .mt-tab-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.78rem; font-weight: 700;
background: none; border: none; border-bottom: 2.5px solid transparent; color: var(--ink-soft);
padding: 0.55rem 0.75rem; cursor: pointer; margin-bottom: -1px;
}
.infographic-pymethods .mt-tab-btn.is-active { color: var(--accent); border-bottom-color: var(--accent); }
.infographic-pymethods .mt-panel.is-hidden-tab { display: none; }
.infographic-pymethods .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.1rem;
}
.infographic-pymethods .code-block .kw { color: var(--accent); font-weight: 700; }
.infographic-pymethods .code-block .deco { font-weight: 700; }
.infographic-pymethods .code-block .deco.cls-c { color: var(--c-cls); }
.infographic-pymethods .code-block .deco.static-c { color: var(--c-static); }
.infographic-pymethods .code-block .self-tag { font-weight: 700; color: var(--c-inst); }
.infographic-pymethods .code-block .cls-tag { font-weight: 700; color: var(--c-cls); }
.infographic-pymethods .row { display: flex; justify-content: center; gap: 0.5rem; margin-bottom: 0.8rem; flex-wrap: wrap; align-items: center; }
.infographic-pymethods .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-pymethods .row input:focus { outline: none; border-color: var(--accent); }
.infographic-pymethods .btn {
font: inherit; font-family: var(--mono-font); font-size: 0.8rem; font-weight: 700;
background: var(--accent); color: #fff; border: none; border-radius: 999px;
padding: 0.45rem 1rem; cursor: pointer;
}
.infographic-pymethods .btn.secondary { background: var(--paper-alt); color: var(--ink); border: 1.5px solid var(--line); border-radius: 6px; }
.infographic-pymethods .clear-row { display: flex; justify-content: center; margin-bottom: 0.9rem; }
.infographic-pymethods .clear-btn {
font: inherit; font-size: 0.76rem; font-weight: 600; color: var(--ink-soft);
background: none; border: 1px solid var(--line); padding: 0.3rem 0.65rem; cursor: pointer; border-radius: 999px;
}
.infographic-pymethods .card-grid { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.7rem; margin-bottom: 1rem; }
.infographic-pymethods .obj-card {
border: 2px solid var(--line); border-radius: 10px; padding: 0.7rem 0.85rem; min-width: 160px;
animation: mt-pop 0.3s ease; text-align: center;
}
@keyframes mt-pop { from { opacity: 0; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } }
.infographic-pymethods .obj-card.inst-c { border-color: var(--c-inst); background: var(--c-inst-soft); }
.infographic-pymethods .obj-card.cls-card { border-color: var(--c-cls); background: var(--c-cls-soft); }
.infographic-pymethods .obj-title { font-family: var(--mono-font); font-size: 0.76rem; font-weight: 700; margin-bottom: 0.45rem; }
.infographic-pymethods .obj-card.inst-c .obj-title { color: var(--c-inst); }
.infographic-pymethods .obj-card.cls-card .obj-title { color: var(--c-cls); }
.infographic-pymethods .obj-attr { font-family: var(--mono-font); font-size: 0.74rem; color: var(--ink-soft); margin-bottom: 0.15rem; }
.infographic-pymethods .obj-attr b { color: var(--ink); }
.infographic-pymethods .obj-attr.school-val b { transition: color 0.3s; }
.infographic-pymethods .obj-call-btn {
display: block; width: 100%; margin-top: 0.45rem;
font: inherit; font-family: var(--mono-font); font-size: 0.72rem; font-weight: 700;
background: var(--paper); border: 1.5px solid; border-radius: 6px; padding: 0.28rem 0.5rem; cursor: pointer;
}
.infographic-pymethods .obj-card.inst-c .obj-call-btn { color: var(--c-inst); border-color: var(--c-inst); }
.infographic-pymethods .obj-result { font-family: var(--mono-font); font-size: 0.72rem; color: var(--ink-soft); margin-top: 0.35rem; min-height: 1.2em; }
.infographic-pymethods .device {
--ed-bg: #1e1e1e; --ed-bar: #2d2d2d; --ed-text: #d4d4d4; --ed-soft: #8a8a8a; --ed-ok: #6fdc8c;
background: var(--ed-bg); border: 1px solid var(--line); border-radius: 8px; overflow: hidden;
}
.infographic-pymethods .device-bar {
display: flex; align-items: center; gap: 0.4rem;
background: var(--ed-bar); padding: 0.5rem 0.7rem; border-bottom: 1px solid #3a3a3a;
font-size: 0.72rem; color: var(--ed-soft); font-weight: 600;
}
.infographic-pymethods .device-bar .dot { width: 9px; height: 9px; border-radius: 50%; background: #5a5a5a; }
.infographic-pymethods .device-bar .dot:nth-child(1) { background: #ff5f56; }
.infographic-pymethods .device-body { padding: 0.75rem 0.9rem; font-family: var(--mono-font); font-size: 0.8rem; color: var(--ed-text); min-height: 50px; }
.infographic-pymethods .mt-caption { text-align: center; font-size: 0.85rem; color: var(--ink-soft); margin-top: 0.9rem; }
.infographic-pymethods .mt-caption strong { color: var(--ink); font-family: var(--mono-font); }
@media (prefers-reduced-motion: reduce) {
.infographic-pymethods *, .infographic-pymethods *::before, .infographic-pymethods *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="mt-wrap">
<h1>Instance, Class & Static Methods</h1>
<p class="mt-sub">Same class, three different relationships to self, cls, and nothing at all.</p>
<div class="mt-tabs">
<button class="mt-tab-btn is-active" data-tab="inst">Instance Method</button>
<button class="mt-tab-btn" data-tab="cls">Class Method</button>
<button class="mt-tab-btn" data-tab="static">Static Method</button>
</div>
<!-- INSTANCE METHOD -->
<div class="mt-panel" id="tabInst">
<div class="code-block"><span class="kw">class</span> Student:
<span class="kw">def</span> __init__(<span class="self-tag">self</span>, name):
<span class="self-tag">self</span>.name = name
<span class="kw">def</span> greet(<span class="self-tag">self</span>):
<span class="kw">return</span> f"Hello {<span class="self-tag">self</span>.name}"</div>
<div class="row">
<input id="instNameInput" type="text" value="Codeveda" placeholder="name" />
<button class="btn" id="instCreateBtn">Create Student</button>
</div>
<div class="clear-row"><button class="clear-btn" id="instClearBtn">↺ Clear</button></div>
<div class="card-grid" id="instGrid"></div>
<p class="mt-caption"><strong>self</strong> is this particular object — each student greets you with their own name.</p>
</div>
<!-- CLASS METHOD -->
<div class="mt-panel is-hidden-tab" id="tabCls">
<div class="code-block"><span class="kw">class</span> Student:
school = "ABC School" <span style="color:var(--c-cls); font-weight:700;"># shared by every student</span>
<span class="kw">def</span> __init__(<span class="self-tag">self</span>, name):
<span class="self-tag">self</span>.name = name
<span class="deco cls-c">@classmethod</span>
<span class="kw">def</span> change_school(<span class="cls-tag">cls</span>, name):
<span class="cls-tag">cls</span>.school = name</div>
<div class="row">
<input id="clsNameInput" type="text" value="Codeveda" placeholder="name" />
<button class="btn" id="clsCreateBtn">Create Student</button>
</div>
<div class="clear-row"><button class="clear-btn" id="clsClearBtn">↺ Clear</button></div>
<div class="card-grid" id="clsGrid"></div>
<div class="row">
<input id="schoolInput" type="text" value="XYZ School" placeholder="new school" />
<button class="btn" id="changeSchoolBtn">Run: Student.change_school(...)</button>
</div>
<p class="mt-caption"><strong>cls</strong> is the class itself — change school once, and every student, even ones already created, sees the new value.</p>
</div>
<!-- STATIC METHOD -->
<div class="mt-panel is-hidden-tab" id="tabStatic">
<div class="code-block"><span class="kw">class</span> Calculator:
<span class="deco static-c">@staticmethod</span>
<span class="kw">def</span> add(a, b):
<span class="kw">return</span> a + b</div>
<div class="row">
<input id="staticA" type="text" value="10" />
<span style="font-family:var(--mono-font); color:var(--ink-soft);">+</span>
<input id="staticB" type="text" value="5" />
</div>
<div class="row">
<button class="btn" id="staticClassBtn">Run: Calculator.add(a, b)</button>
<button class="btn secondary" id="staticInstBtn">Run: calc.add(a, b)</button>
</div>
<div class="device">
<div class="device-bar"><span class="dot"></span><span class="dot"></span><span class="dot"></span> Terminal</div>
<div class="device-body" id="staticLog">Neither call needs self or cls — add() doesn't care about any object or the class, it's just a function that lives here for organization.</div>
</div>
<p class="mt-caption">Calling it on the class or on an instance makes no difference — the result is identical either way.</p>
</div>
</div>
<script>
(function () {
var root = document.currentScript.closest('.infographic-pymethods')
|| document.querySelector('.infographic-pymethods');
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');
/* ---------------- tabs ---------------- */
var tabBtns = root.querySelectorAll('.mt-tab-btn');
var panels = { inst: root.querySelector('#tabInst'), cls: root.querySelector('#tabCls'), static: root.querySelector('#tabStatic') };
tabBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
tabBtns.forEach(function (b) { b.classList.toggle('is-active', b === btn); });
var target = btn.dataset.tab;
Object.keys(panels).forEach(function (key) {
panels[key].classList.toggle('is-hidden-tab', key !== target);
});
});
});
/* ---------------- INSTANCE METHOD ---------------- */
var instNameInput = root.querySelector('#instNameInput');
var instCreateBtn = root.querySelector('#instCreateBtn');
var instGrid = root.querySelector('#instGrid');
var instCount = 0;
instCreateBtn.addEventListener('click', function () {
var name = (instNameInput.value || '').trim() || 'Codeveda';
instCount++;
var varName = 's' + instCount;
var card = document.createElement('div');
card.className = 'obj-card inst-c';
card.innerHTML =
'<div class="obj-title">' + varName + ' = Student("' + name + '")</div>' +
'<button class="obj-call-btn">call ' + varName + '.greet()</button>' +
'<div class="obj-result"></div>';
instGrid.appendChild(card);
var resultEl = card.querySelector('.obj-result');
card.querySelector('.obj-call-btn').addEventListener('click', function () {
resultEl.textContent = '"Hello ' + name + '"';
});
});
root.querySelector('#instClearBtn').addEventListener('click', function () {
instGrid.innerHTML = '';
instCount = 0;
});
/* ---------------- CLASS METHOD ---------------- */
var clsNameInput = root.querySelector('#clsNameInput');
var clsCreateBtn = root.querySelector('#clsCreateBtn');
var clsGrid = root.querySelector('#clsGrid');
var schoolInput = root.querySelector('#schoolInput');
var changeSchoolBtn = root.querySelector('#changeSchoolBtn');
var clsCount = 0;
var sharedSchool = 'ABC School';
var schoolEls = [];
function refreshSchools() {
schoolEls.forEach(function (el) { el.textContent = sharedSchool; });
}
clsCreateBtn.addEventListener('click', function () {
var name = (clsNameInput.value || '').trim() || 'Codeveda';
clsCount++;
var varName = 's' + clsCount;
var card = document.createElement('div');
card.className = 'obj-card cls-card';
card.innerHTML =
'<div class="obj-title">' + varName + ' = Student("' + name + '")</div>' +
'<div class="obj-attr">.name = <b>' + name + '</b></div>' +
'<div class="obj-attr school-val">.school = <b class="schoolVal">' + sharedSchool + '</b></div>';
clsGrid.appendChild(card);
schoolEls.push(card.querySelector('.schoolVal'));
});
root.querySelector('#clsClearBtn').addEventListener('click', function () {
clsGrid.innerHTML = '';
clsCount = 0;
schoolEls = [];
});
changeSchoolBtn.addEventListener('click', function () {
sharedSchool = (schoolInput.value || '').trim() || 'XYZ School';
refreshSchools();
});
/* ---------------- STATIC METHOD ---------------- */
var staticA = root.querySelector('#staticA');
var staticB = root.querySelector('#staticB');
var staticLog = root.querySelector('#staticLog');
function runStatic(via) {
var a = parseFloat(staticA.value) || 0;
var b = parseFloat(staticB.value) || 0;
var call = via === 'class' ? 'Calculator.add(' + a + ', ' + b + ')' : 'calc.add(' + a + ', ' + b + ')';
staticLog.textContent = '>>> ' + call + '\n' + (a + b);
}
root.querySelector('#staticClassBtn').addEventListener('click', function () { runStatic('class'); });
root.querySelector('#staticInstBtn').addEventListener('click', function () { runStatic('inst'); });
})();
</script>
</div>⚖️ Quick Comparison
Instance Method 👤 | Class Method 🏫 | Static Method 🛠️ |
|---|---|---|
Uses | Uses | No |
Works with object data | Works with class data | Independent of object/class data |
Called using object | Can be called using class/object | Usually called using class |
No decorator required |
|
|
⭐ Remember
Instance Method → self → Object 👤
Class Method → cls → Class 🏫
Static Method → none → Independent 🛠️Easy rule:
If you need the object →
self
If you need the class →cls
If you need neither →@staticmethod