Repository navigation
Expand file tree
/
Copy path8_OOPs_in_Python.html
More file actions
1535 lines (1336 loc) · 175 KB
/
Copy path8_OOPs_in_Python.html
File metadata and controls
1535 lines (1336 loc) · 175 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Object-Oriented Programming in Python: A Complete Guide · Python Programming Series</title>
<meta name="description" content="A complete guide to Object-Oriented Programming in Python: classes, objects, encapsulation, inheritance, polymorphism, and abstraction, with analogies throughout and real examples from Amazon, Uber, Apple, and Tesla.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,700;12..96,800&family=Figtree:ital,wght@0,400;0,500;0,600;0,700;1,400&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root{
--paper:#F7F4FF;--surface:#FFFFFF;--tint:#F1EBFF;
--ink:#1D1442;--ink-soft:#4A3F73;--ink-faint:#8A80AD;
--violet:#6B3CF5;--violet-deep:#4F22D9;--violet-soft:#ECE5FF;
--pink:#F0378A;--pink-text:#C41E6A;--pink-soft:#FFE8F2;
--mint:#00B894;--mint-text:#007F66;--mint-soft:#DDF7F0;
--sun:#FFB627;--sun-soft:#FFF3D6;
--orange:#FF6B35;--orange-text:#C2410C;--orange-soft:#FFE9DF;
--sky:#1E9BF0;--sky-text:#0B6FB8;--sky-soft:#E1F1FD;
--line:#E2DAF7;--line-strong:#C9BDF0;
--code-bg:#1F1147;--code-head:#180D3A;--code-line:#2E1D63;--out-bg:#170B36;
--r-s:8px;--r-m:14px;--r-l:22px;
--font-d:'Bricolage Grotesque','Arial Rounded MT Bold',sans-serif;
--font-b:'Figtree',-apple-system,'Segoe UI',sans-serif;
--font-m:'JetBrains Mono','SFMono-Regular',Consolas,monospace;
}
*,*::before,*::after{box-sizing:border-box;}
html{scroll-behavior:smooth;}
body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--font-b);font-size:17px;line-height:1.68;-webkit-font-smoothing:antialiased;}
a{color:var(--violet-deep);text-decoration-color:rgba(107,60,245,.35);text-underline-offset:3px;text-decoration-thickness:2px;}
a:hover{text-decoration-color:currentColor;}
::selection{background:var(--pink);color:#fff;}
:focus-visible{outline:3px solid var(--pink);outline-offset:2px;border-radius:4px;}
.icon{width:1em;height:1em;display:inline-block;vertical-align:-.15em;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;}
.shell{max-width:1300px;margin:0 auto;padding:0 clamp(16px,4vw,44px);}
.topbar{display:none;position:sticky;top:0;z-index:40;align-items:center;justify-content:space-between;padding:12px clamp(16px,4vw,44px);background:rgba(255,255,255,.94);backdrop-filter:blur(8px);border-bottom:2px solid var(--violet-soft);}
.topbar .brand{font-family:var(--font-d);font-weight:800;font-size:.98rem;color:var(--ink);}
.topbar .brand span{color:var(--violet);}
.topbar button{border:2px solid var(--violet-soft);background:var(--surface);border-radius:var(--r-s);width:40px;height:36px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--violet);}
/* ---------- Hero: the one loud moment ---------- */
.hero{position:relative;margin:clamp(16px,2.5vw,28px) 0 clamp(36px,5vw,56px);padding:clamp(36px,5.5vw,68px) clamp(22px,4.5vw,60px);background:var(--violet);color:#fff;border-radius:var(--r-l);overflow:hidden;display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:clamp(28px,4vw,56px);align-items:center;}
.hero::before{content:"";position:absolute;width:420px;height:420px;border-radius:50%;background:var(--violet-deep);right:-120px;top:-160px;}
.hero::after{content:"";position:absolute;width:180px;height:180px;border-radius:50%;background:var(--pink);left:-70px;bottom:-90px;opacity:.9;}
.hero-copy,.hero-art{position:relative;z-index:1;}
.hero-eyebrow{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-weight:600;font-size:.95rem;color:rgba(255,255,255,.86);margin-bottom:20px;}
.hero-eyebrow .badge{background:var(--sun);color:var(--ink);font-family:var(--font-d);font-weight:800;padding:4px 13px;border-radius:999px;font-size:.92rem;}
h1.title{font-family:var(--font-d);font-weight:800;font-size:clamp(2.15rem,4.6vw,3.7rem);line-height:1.02;letter-spacing:-.025em;margin:0 0 20px;max-width:16ch;color:#fff;}
.hero-sub{font-size:clamp(1rem,1.5vw,1.12rem);color:rgba(255,255,255,.9);max-width:58ch;margin:0 0 28px;}
.hero-sub strong{color:#fff;font-weight:700;}
.hero-chips{display:flex;flex-wrap:wrap;gap:10px;}
.chip{display:flex;align-items:center;gap:8px;background:rgba(255,255,255,.13);border:1.5px solid rgba(255,255,255,.28);padding:7px 14px 7px 10px;border-radius:999px;font-size:.88rem;font-weight:600;color:#fff;}
.chip .icon{width:1.15em;height:1.15em;}
.chip:nth-child(1) .icon{color:var(--sun);}
.chip:nth-child(2) .icon{color:#7FF0D2;}
.chip:nth-child(3) .icon{color:#FF9BC6;}
.chip:nth-child(4) .icon{color:#9FD6FF;}
.hero-art{display:flex;flex-direction:column;align-items:center;}
.blueprint{width:min(250px,100%);border:2.5px dashed rgba(255,255,255,.75);border-radius:var(--r-m);padding:14px 16px 12px;font-family:var(--font-m);font-size:.8rem;color:#fff;background:rgba(255,255,255,.06);}
.bp-title{font-weight:700;margin-bottom:8px;}
.bp-title .kw{color:#FF9BC6;}
.bp-title .cn{color:var(--sun);}
.bp-line{padding:2px 0 2px 14px;color:rgba(255,255,255,.82);}
.bp-line.m{color:#7FF0D2;}
.fan{width:min(330px,100%);height:44px;display:block;}
.fan path{stroke:rgba(255,255,255,.7);stroke-width:2;fill:none;stroke-dasharray:4 4;vector-effect:non-scaling-stroke;}
.objs{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;width:min(360px,100%);}
.obj{border-radius:12px;padding:10px 10px 9px;font-family:var(--font-m);font-size:.72rem;line-height:1.5;color:var(--ink);box-shadow:0 6px 0 rgba(29,20,66,.28);animation:stamp .5s cubic-bezier(.3,1.5,.6,1) both;}
.obj b{display:block;font-family:var(--font-d);font-size:1rem;font-weight:800;margin-bottom:3px;}
.obj span{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.o1{background:var(--sun);transform:rotate(-4deg);animation-delay:.25s;}
.o2{background:#7FF0D2;transform:rotate(2deg);animation-delay:.45s;}
.o3{background:#FF9BC6;transform:rotate(-1.5deg);animation-delay:.65s;}
@keyframes stamp{from{opacity:0;translate:0 -26px;scale:.85;}to{opacity:1;translate:0 0;scale:1;}}
.art-cap{margin:18px 0 0;font-family:var(--font-d);font-weight:700;font-size:.95rem;color:rgba(255,255,255,.9);}
/* ---------- Layout + sidebar ---------- */
.layout{display:grid;grid-template-columns:265px minmax(0,1fr);gap:clamp(24px,4vw,56px);align-items:start;padding-bottom:90px;}
.sidebar{position:sticky;top:24px;max-height:calc(100vh - 48px);overflow-y:auto;padding:16px 10px 16px 0;}
.sidebar::-webkit-scrollbar{width:5px;}
.sidebar::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:3px;}
.toc-label{font-family:var(--font-d);font-weight:800;font-size:1rem;color:var(--ink);margin:0 0 10px;padding-left:12px;}
.toc{list-style:none;margin:0;padding:0;}
.toc li{margin:0 0 2px;}
.toc a{display:flex;align-items:center;gap:10px;padding:7px 12px;font-size:.88rem;font-weight:500;color:var(--ink-soft);text-decoration:none;border-radius:10px;transition:background .15s,color .15s;}
.toc a .icon{width:1.05em;height:1.05em;flex:none;color:var(--violet);}
.toc a:hover{background:var(--violet-soft);color:var(--ink);}
.toc a.active{background:var(--violet);color:#fff;font-weight:600;}
.toc a.active .icon{color:var(--sun);}
/* ---------- Article ---------- */
.article{min-width:0;padding-top:8px;max-width:820px;}
.article h2{--acc:var(--violet);font-family:var(--font-d);font-weight:800;font-size:clamp(1.55rem,2.6vw,2rem);line-height:1.15;letter-spacing:-.015em;margin:64px 0 18px;scroll-margin-top:24px;display:flex;align-items:center;gap:14px;}
.article h2:nth-of-type(5n+2){--acc:var(--pink);}
.article h2:nth-of-type(5n+3){--acc:var(--mint);}
.article h2:nth-of-type(5n+4){--acc:var(--orange);}
.article h2:nth-of-type(5n+5){--acc:var(--sky);}
.article>h2:first-of-type{margin-top:4px;}
.article>hr:first-child{display:none;}
.article h2 .h-icon{width:2.6rem;height:2.6rem;flex:none;display:grid;place-items:center;background:var(--acc);color:#fff;border-radius:12px;transform:rotate(-4deg);box-shadow:0 4px 0 rgba(29,20,66,.18);}
.article h2 .h-icon .icon{width:1.35rem;height:1.35rem;stroke-width:2;}
.article h3{font-family:var(--font-d);font-weight:700;font-size:1.2rem;margin:34px 0 10px;scroll-margin-top:24px;color:var(--ink);}
.article p{margin:0 0 17px;}
.article ul,.article ol{margin:0 0 20px;padding-left:1.35em;}
.article li{margin-bottom:8px;padding-left:.2em;}
.article ul li::marker{color:var(--pink);font-size:1.15em;}
.article ol li::marker{color:var(--violet);font-family:var(--font-d);font-weight:800;}
.article strong{font-weight:700;}
.article hr{border:0;height:6px;width:110px;margin:52px auto;border-radius:6px;background:linear-gradient(90deg,var(--violet) 0 20%,var(--pink) 20% 40%,var(--mint) 40% 60%,var(--sun) 60% 80%,var(--sky) 80% 100%);}
.article code{font-family:var(--font-m);font-size:.84em;background:var(--pink-soft);padding:.12em .4em;border-radius:6px;color:var(--pink-text);}
.article blockquote{margin:22px 0;padding:16px 20px;border-left:5px solid var(--sun);background:var(--sun-soft);border-radius:0 var(--r-m) var(--r-m) 0;color:var(--ink);}
.article blockquote p{margin:0;color:inherit;}
.table-wrap{overflow-x:auto;margin:22px 0 28px;border-radius:var(--r-m);border:2px solid var(--violet-soft);background:var(--surface);}
.article table{width:100%;border-collapse:collapse;font-size:.9rem;}
.article thead th{background:var(--violet);color:#fff;font-family:var(--font-d);font-weight:700;text-align:left;padding:12px 16px;white-space:nowrap;font-size:.9rem;}
.article tbody td{padding:11px 16px;border-bottom:1px solid var(--line);vertical-align:top;}
.article tbody tr:last-child td{border-bottom:none;}
.article tbody tr:nth-child(even){background:#FAF7FF;}
.article tbody td code{white-space:nowrap;}
/* ---------- Code ---------- */
.code-card{margin:22px 0 26px;border-radius:var(--r-m);overflow:hidden;background:var(--code-bg);box-shadow:0 6px 0 var(--violet-soft);}
.code-card .code-head{display:flex;align-items:center;justify-content:space-between;padding:9px 14px;background:var(--code-head);border-bottom:1px solid var(--code-line);}
.code-card .dots{display:flex;gap:6px;}
.code-card .dots span{width:10px;height:10px;border-radius:50%;display:block;}
.code-card .dots span:nth-child(1){background:var(--pink);}
.code-card .dots span:nth-child(2){background:var(--sun);}
.code-card .dots span:nth-child(3){background:var(--mint);}
.code-card .lang{font-family:var(--font-m);font-size:.72rem;color:#9C8CD6;}
.code-card .copy-btn{font-family:var(--font-b);font-weight:600;font-size:.76rem;color:#E4DCFF;background:rgba(255,255,255,.06);border:1px solid #3D2A7A;border-radius:7px;padding:4px 10px;cursor:pointer;display:flex;align-items:center;gap:6px;transition:background .15s,border-color .15s;}
.code-card .copy-btn:hover{background:var(--violet);border-color:var(--violet);color:#fff;}
.code-card .copy-btn .icon{width:.95em;height:.95em;}
.code-card pre{margin:0;padding:16px 20px;overflow-x:auto;font-size:.85rem;line-height:1.6;}
.code-card code{font-family:var(--font-m);font-size:1em;line-height:inherit;color:#F3EEFF;background:none;padding:0;border-radius:0;}
.code-card .k,.code-card .kn,.code-card .kd,.code-card .kc,.code-card .ow{color:#FF6FAE;}
.code-card .nb,.code-card .bp{color:#9FD6FF;}
.code-card .nf,.code-card .fm{color:#4BE3C1;}
.code-card .s,.code-card .s1,.code-card .s2,.code-card .sa,.code-card .sd,.code-card .se{color:#FFD166;}
.code-card .si{color:#FF9F5A;}
.code-card .mi,.code-card .mf{color:#FF9F5A;}
.code-card .o,.code-card .p{color:#B7A8E8;}
.code-card .c,.code-card .c1,.code-card .cm{color:#8E7CC3;font-style:italic;}
.code-card .n{color:#F3EEFF;}
.code-card .nc,.code-card .ne{color:#7CC8FF;font-weight:600;}
.output-card{margin:-26px 0 26px;border-radius:0 0 var(--r-m) var(--r-m);overflow:hidden;background:var(--out-bg);border-top:2px dashed #3D2A7A;box-shadow:0 6px 0 var(--violet-soft);position:relative;z-index:1;}
.output-card::before{content:"Output";display:block;font-family:var(--font-b);font-weight:700;font-size:.74rem;color:#4BE3C1;padding:9px 20px 0;}
.output-card pre{margin:0;padding:4px 20px 16px;overflow-x:auto;font-size:.82rem;line-height:1.6;}
.output-card code{font-family:var(--font-m);font-size:1em;line-height:inherit;color:#D7CCFF;background:none;padding:0;border-radius:0;}
.diagram-card{margin:22px 0 26px;border-radius:var(--r-m);overflow:hidden;position:relative;border:2.5px dashed var(--line-strong);background:var(--surface);}
.diagram-card::before{content:"diagram";position:absolute;top:10px;right:14px;font-family:var(--font-b);font-weight:700;font-size:.74rem;color:var(--violet);}
.diagram-card pre{margin:0;padding:26px 22px 20px;overflow-x:auto;}
.diagram-card code{font-family:var(--font-m);font-size:.95rem;line-height:1.5;color:var(--violet-deep);font-weight:700;background:none;padding:0;white-space:pre;}
.svg-diagram{margin:24px 0 28px;padding:22px 20px 18px;background:var(--surface);border:2px solid var(--violet-soft);border-radius:var(--r-m);}
.svg-diagram{overflow-x:auto;}
.svg-diagram svg{width:100%;min-width:560px;height:auto;display:block;}
.svg-diagram .cap{font-size:.86rem;font-weight:500;color:var(--ink-faint);text-align:center;margin-top:12px;}
.article-end{margin-top:56px;padding:30px 30px;border-radius:var(--r-l);background:var(--violet);color:#fff;position:relative;overflow:hidden;}
.article-end::after{content:"";position:absolute;width:140px;height:140px;border-radius:50%;background:var(--sun);right:-50px;bottom:-60px;}
.article-end p{margin:0;font-size:1.06rem;color:rgba(255,255,255,.92);position:relative;z-index:1;max-width:62ch;}
.article-end p strong{color:#fff;}
footer.site-footer{border-top:2px solid var(--violet-soft);margin-top:30px;padding:22px clamp(16px,4vw,44px) 40px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;}
footer.site-footer .f-left{font-size:.88rem;font-weight:500;color:var(--ink-faint);}
footer.site-footer a{font-size:.9rem;font-weight:600;}
@media(max-width:960px){
.topbar{display:flex;}
.layout{grid-template-columns:1fr;}
.article{max-width:none;}
.sidebar{position:fixed;inset:60px 0 0 0;z-index:35;background:var(--paper);padding:18px clamp(16px,4vw,44px) 24px;transform:translateX(-100%);transition:transform .2s;max-height:none;height:calc(100vh - 60px);}
.sidebar.open{transform:translateX(0);}
.hero{grid-template-columns:1fr;}
}
@media(max-width:520px){
.article h2 .h-icon{width:2.2rem;height:2.2rem;}
.obj{font-size:.66rem;padding:9px 8px;}
}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto;}.sidebar{transition:none;}.obj{animation:none;}}
</style>
</head>
<body>
<svg style="display:none" aria-hidden="true"><defs>
<symbol id="icon-layers" viewBox="0 0 24 24">
<polygon points="12,2 22,8.5 12,15 2,8.5"/>
<polyline points="2,15.5 12,22 22,15.5"/>
<polyline points="2,11.5 12,18 22,11.5"/>
</symbol>
<symbol id="icon-blueprint" viewBox="0 0 24 24">
<rect x="2" y="3" width="20" height="18" rx="1.5"/>
<line x1="7" y1="3" x2="7" y2="21"/><line x1="2" y1="9" x2="22" y2="9"/>
<line x1="2" y1="15" x2="22" y2="15"/>
<line x1="13" y1="9" x2="13" y2="21"/>
<circle cx="10" cy="6" r="1.5" fill="currentColor" stroke="none"/>
</symbol>
<symbol id="icon-database" viewBox="0 0 24 24">
<ellipse cx="12" cy="5" rx="9" ry="3"/>
<path d="M3 5v4c0 1.66 4 3 9 3s9-1.34 9-3V5"/>
<path d="M3 9v4c0 1.66 4 3 9 3s9-1.34 9-3V9"/>
<path d="M3 13v4c0 1.66 4 3 9 3s9-1.34 9-3v-4"/>
</symbol>
<symbol id="icon-function" viewBox="0 0 24 24">
<path d="M16 3a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2 2 2 0 0 1 2 2v4a2 2 0 0 0 2 2"/>
<path d="M8 3a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2 2 2 0 0 0-2 2v4a2 2 0 0 1-2 2"/>
</symbol>
<symbol id="icon-lock" viewBox="0 0 24 24">
<rect x="3" y="11" width="18" height="11" rx="2" ry="2"/>
<path d="M7 11V7a5 5 0 0 1 10 0v4"/>
<circle cx="12" cy="16" r="1.2" fill="currentColor" stroke="none"/>
</symbol>
<symbol id="icon-tree" viewBox="0 0 24 24">
<rect x="9.5" y="1" width="5" height="4" rx="1"/>
<rect x="1" y="15" width="5" height="4" rx="1"/>
<rect x="9.5" y="15" width="5" height="4" rx="1"/>
<rect x="18" y="15" width="5" height="4" rx="1"/>
<line x1="12" y1="5" x2="12" y2="11"/><line x1="12" y1="11" x2="3" y2="15"/>
<line x1="12" y1="11" x2="12" y2="15"/><line x1="12" y1="11" x2="20.5" y2="15"/>
</symbol>
<symbol id="icon-morph" viewBox="0 0 24 24">
<circle cx="5" cy="12" r="3"/><circle cx="19" cy="8" r="2.5"/>
<circle cx="19" cy="16" r="2"/>
<line x1="8" y1="12" x2="16.5" y2="8.8"/>
<line x1="8" y1="12" x2="17" y2="15.5"/>
</symbol>
<symbol id="icon-overload" viewBox="0 0 24 24">
<rect x="2" y="3" width="8" height="6" rx="1.2"/>
<rect x="2" y="15" width="8" height="6" rx="1.2"/>
<line x1="10" y1="6" x2="22" y2="6"/><line x1="10" y1="18" x2="22" y2="18"/>
<line x1="18" y1="6" x2="18" y2="18"/>
<polyline points="15,9 18,6 21,9"/>
<polyline points="15,15 18,18 21,15"/>
</symbol>
<symbol id="icon-abstract" viewBox="0 0 24 24">
<rect x="2" y="3" width="20" height="7" rx="1.5"/>
<rect x="5" y="14" width="6" height="7" rx="1.2"/>
<rect x="13" y="14" width="6" height="7" rx="1.2"/>
<line x1="8" y1="10" x2="8" y2="14"/><line x1="16" y1="10" x2="16" y2="14"/>
</symbol>
<symbol id="icon-table" viewBox="0 0 24 24">
<rect x="2" y="3" width="20" height="18" rx="1.5"/>
<line x1="2" y1="9" x2="22" y2="9"/>
<line x1="9" y1="3" x2="9" y2="21"/>
<line x1="15.5" y1="3" x2="15.5" y2="21"/>
</symbol>
<symbol id="icon-copy" viewBox="0 0 24 24">
<rect x="8" y="8" width="12" height="13" rx="1.6"/>
<path d="M5 16H4.5A1.5 1.5 0 0 1 3 14.5v-10A1.5 1.5 0 0 1 4.5 3h10A1.5 1.5 0 0 1 16 4.5V5"/>
</symbol>
<symbol id="icon-check" viewBox="0 0 24 24">
<path d="M4 12.5 L9.5 18 L20 5"/>
</symbol>
<symbol id="icon-menu" viewBox="0 0 24 24">
<line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/>
</symbol>
<symbol id="icon-close" viewBox="0 0 24 24">
<line x1="5" y1="5" x2="19" y2="19"/><line x1="19" y1="5" x2="5" y2="19"/>
</symbol>
</defs></svg>
<div class="topbar">
<span class="brand">§9 <span>OOP in Python</span></span>
<button id="navToggle" aria-label="Toggle navigation">
<svg class="icon"><use href="#icon-menu"></use></svg>
</button>
</div>
<div class="shell" id="top">
<section class="hero">
<div class="hero-copy">
<div class="hero-eyebrow"><span class="badge">Article 9</span> Python Programming Series</div>
<h1 class="title">Object-Oriented Programming in Python: A Complete Guide</h1>
<p class="hero-sub">Before OOP, code is usually written <strong>procedurally</strong>: one long list of instructions, with data passed from function to function. That works fine for small scripts, but it gets hard to manage as a program grows. Object-Oriented Programming groups related data and the functions that act on it into a single unit called an <strong>object</strong>, which makes code easier to read, reuse, and extend.</p>
<div class="hero-chips">
<div class="chip"><svg class="icon"><use href="#icon-blueprint"></use></svg> Classes & objects</div>
<div class="chip"><svg class="icon"><use href="#icon-tree"></use></svg> All 5 types of inheritance</div>
<div class="chip"><svg class="icon"><use href="#icon-morph"></use></svg> Polymorphism & duck typing</div>
<div class="chip"><svg class="icon"><use href="#icon-lock"></use></svg> Encapsulation & abstraction</div>
</div>
</div>
<div class="hero-art" aria-hidden="true">
<div class="blueprint">
<div class="bp-title"><span class="kw">class</span> <span class="cn">Account</span>:</div>
<div class="bp-line">name</div>
<div class="bp-line">acc_no</div>
<div class="bp-line">bal</div>
<div class="bp-line m">deposit()</div>
</div>
<svg class="fan" viewBox="0 0 330 44" preserveAspectRatio="none"><path d="M165 0 C165 24 55 18 55 44"/><path d="M165 0 L165 44"/><path d="M165 0 C165 24 275 18 275 44"/></svg>
<div class="objs">
<div class="obj o1"><b>acc1</b><span>Rishabh</span><span>101</span><span>25000</span></div>
<div class="obj o2"><b>acc2</b><span>Priya</span><span>102</span><span>67548</span></div>
<div class="obj o3"><b>acc3</b><span>Roshan</span><span>103</span><span>76000</span></div>
</div>
<p class="art-cap">One class, three objects</p>
</div>
</section>
<div class="layout">
<nav class="sidebar" id="sidebar">
<div class="toc-label">On this page</div>
<ul class="toc">
<li><a href="#procedural-vs-oop-side-by-side"><svg class="icon"><use href="#icon-layers"></use></svg><span>Procedural vs. OOP, Side by Side</span></a></li>
<li><a href="#the-four-pillars-of-oop"><svg class="icon"><use href="#icon-layers"></use></svg><span>The Four Pillars of OOP</span></a></li>
<li><a href="#1-classes-and-objects"><svg class="icon"><use href="#icon-blueprint"></use></svg><span>1. Classes and Objects</span></a></li>
<li><a href="#2-class-variables-vs-instance-variables"><svg class="icon"><use href="#icon-database"></use></svg><span>2. Class Variables vs. Instance Variables</span></a></li>
<li><a href="#3-methods-functions-inside-a-class"><svg class="icon"><use href="#icon-function"></use></svg><span>3. Methods: Functions Inside a Class</span></a></li>
<li><a href="#4-encapsulation"><svg class="icon"><use href="#icon-lock"></use></svg><span>4. Encapsulation</span></a></li>
<li><a href="#5-inheritance"><svg class="icon"><use href="#icon-tree"></use></svg><span>5. Inheritance</span></a></li>
<li><a href="#6-polymorphism"><svg class="icon"><use href="#icon-morph"></use></svg><span>6. Polymorphism</span></a></li>
<li><a href="#7-overriding-overloading-and-operator-overloading"><svg class="icon"><use href="#icon-overload"></use></svg><span>7. Overriding, Overloading, and Operator Overloading</span></a></li>
<li><a href="#8-abstraction"><svg class="icon"><use href="#icon-abstract"></use></svg><span>8. Abstraction</span></a></li>
<li><a href="#summary"><svg class="icon"><use href="#icon-table"></use></svg><span>Summary</span></a></li>
</ul>
</nav>
<main class="article">
<hr />
<h2 id="procedural-vs-oop-side-by-side"><span class="h-icon"><svg class="icon"><use href="#icon-layers"></use></svg></span>Procedural vs. OOP, Side by Side</h2>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="c1"># Procedural way</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deposit_money</span><span class="p">(</span><span class="n">account_name</span><span class="p">,</span> <span class="n">balance</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
<span class="n">balance</span> <span class="o">+=</span> <span class="n">amount</span>
<span class="k">return</span> <span class="n">balance</span>
<span class="c1"># OOP way: the action belongs to the object</span>
<span class="n">account</span><span class="o">.</span><span class="n">deposit</span><span class="p">(</span><span class="mi">500</span><span class="p">)</span>
</code></pre></div>
<div class="table-wrap"><table>
<thead>
<tr>
<th>Aspect</th>
<th>Procedural</th>
<th>Object-Oriented</th>
</tr>
</thead>
<tbody>
<tr>
<td>Focus</td>
<td>Functions</td>
<td>Objects and their interactions</td>
</tr>
<tr>
<td>Data</td>
<td>Passed freely between functions</td>
<td>Bundled inside the object</td>
</tr>
<tr>
<td>Code reuse</td>
<td>Functions</td>
<td>Inheritance</td>
</tr>
<tr>
<td>Modeling the real world</td>
<td>Awkward</td>
<td>Natural</td>
</tr>
</tbody>
</table></div>
<p>In the OOP version, the account <em>knows how to deposit into itself</em>. The data (the balance) and the behavior (the deposit action) live in the same place, which is the core idea behind everything else in this guide.</p>
<h2 id="the-four-pillars-of-oop"><span class="h-icon"><svg class="icon"><use href="#icon-layers"></use></svg></span>The Four Pillars of OOP</h2>
<ol>
<li><strong>Encapsulation</strong>: bundle data and methods together, and control who can access the data.</li>
<li><strong>Inheritance</strong>: build new classes by extending existing ones.</li>
<li><strong>Polymorphism</strong>: the same method name behaves differently depending on the object.</li>
<li><strong>Abstraction</strong>: expose only what's necessary, hide the complexity.</li>
</ol>
<div class="svg-diagram"><svg viewBox="0 0 640 168" xmlns="http://www.w3.org/2000/svg" font-family="'JetBrains Mono', monospace">
<rect x="4" y="10" width="150" height="150" rx="8" fill="#F1EBFF" stroke="#6B3CF5" stroke-width="2"/>
<text x="79" y="34" text-anchor="middle" font-size="11" font-weight="700" fill="#4F22D9">ENCAPSULATION</text>
<text x="79" y="70" text-anchor="middle" font-size="9.5" fill="#4A3F73">Bundle data +</text>
<text x="79" y="84" text-anchor="middle" font-size="9.5" fill="#4A3F73">control access</text>
<text x="79" y="120" text-anchor="middle" font-size="8.5" fill="#8A80AD">Only the teller</text>
<text x="79" y="132" text-anchor="middle" font-size="8.5" fill="#8A80AD">opens the vault</text>
<rect x="164" y="10" width="150" height="150" rx="8" fill="#DDF7F0" stroke="#00B894" stroke-width="2"/>
<text x="239" y="34" text-anchor="middle" font-size="11" font-weight="700" fill="#007F66">INHERITANCE</text>
<text x="239" y="70" text-anchor="middle" font-size="9.5" fill="#4A3F73">Reuse + extend</text>
<text x="239" y="84" text-anchor="middle" font-size="9.5" fill="#4A3F73">existing classes</text>
<text x="239" y="120" text-anchor="middle" font-size="8.5" fill="#8A80AD">SavingsAccount</text>
<text x="239" y="132" text-anchor="middle" font-size="8.5" fill="#8A80AD">is also an Account</text>
<rect x="324" y="10" width="150" height="150" rx="8" fill="#FFE9DF" stroke="#FF6B35" stroke-width="2"/>
<text x="399" y="34" text-anchor="middle" font-size="11" font-weight="700" fill="#C2410C">POLYMORPHISM</text>
<text x="399" y="70" text-anchor="middle" font-size="9.5" fill="#4A3F73">Same name,</text>
<text x="399" y="84" text-anchor="middle" font-size="9.5" fill="#4A3F73">different behavior</text>
<text x="399" y="120" text-anchor="middle" font-size="8.5" fill="#8A80AD">.speak() → Meow,</text>
<text x="399" y="132" text-anchor="middle" font-size="8.5" fill="#8A80AD">Woof, or Quack</text>
<rect x="484" y="10" width="150" height="150" rx="8" fill="#FFE8F2" stroke="#F0378A" stroke-width="2"/>
<text x="559" y="34" text-anchor="middle" font-size="11" font-weight="700" fill="#C41E6A">ABSTRACTION</text>
<text x="559" y="70" text-anchor="middle" font-size="9.5" fill="#4A3F73">Define WHAT,</text>
<text x="559" y="84" text-anchor="middle" font-size="9.5" fill="#4A3F73">hide HOW</text>
<text x="559" y="120" text-anchor="middle" font-size="8.5" fill="#8A80AD">Brake pedal hides</text>
<text x="559" y="132" text-anchor="middle" font-size="8.5" fill="#8A80AD">the hydraulics</text>
</svg>
<div class="cap">The four pillars, at a glance</div></div><p>Big tech runs on exactly these ideas: every Google search, Gmail message, and YouTube video is an object with its own attributes and methods. Every Amazon product, order, and shipment is an object interacting with others. An Uber <code>Ride</code> object ties together a <code>Driver</code>, a <code>Rider</code>, a <code>Car</code>, and a <code>Route</code>. Netflix uses one base class to power <code>Movie</code>, <code>Series</code>, and <code>Documentary</code> objects that all stream the same way.</p>
<p>We'll use a <strong>banking application</strong> as the running example throughout.</p>
<hr />
<h2 id="1-classes-and-objects"><span class="h-icon"><svg class="icon"><use href="#icon-blueprint"></use></svg></span>1. Classes and Objects</h2>
<p>A <strong>class</strong> is a blueprint that defines what an entity looks like and what it can do. An <strong>object</strong> is a specific instance built from that blueprint.</p>
<p><strong>Analogy:</strong> the blueprint of a house is the class. It describes the rooms, doors, and windows, but you can't live in a blueprint. Your actual house, built from that blueprint with its own address and paint color, is the object. From one blueprint you can build many houses; from one class you can create many objects.</p>
<p>A few things worth internalizing:</p>
<ul>
<li>A class defines both the <strong>structure</strong> (what data it holds) and the <strong>behavior</strong> (what it can do).</li>
<li>Each object gets its own copy of the data, with its own values.</li>
<li>All objects of the same class share the same methods.</li>
<li>Defining a class doesn't create any objects; each object's own data only comes into existence when you create that object.</li>
</ul>
<h3 id="__init__-the-constructor"><code>__init__</code>: The Constructor</h3>
<p><code>__init__</code> is a special method Python calls automatically the moment you create an object. It sets up the object's starting data.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">acc1</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Rishabh'</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">25000</span><span class="p">)</span>
<span class="c1"># Python automatically calls Account.__init__(acc1, 'Rishabh', 101, 25000)</span>
</code></pre></div>
<h3 id="self-the-object-referring-to-itself"><code>self</code>: The Object Referring to Itself</h3>
<p><code>self</code> is how a method (a function defined inside a class) refers to the specific object it's being called on. When you write <code>acc1.deposit(500)</code>, Python translates that internally to <code>Account.deposit(acc1, 500)</code>, passing the object itself as the first argument automatically. That's why every regular method inside a class lists <code>self</code> as its first parameter. Think of <code>self</code> as the word "I" in a sentence: it's how the object refers to its own data.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Account</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">accountnumber</span><span class="p">,</span> <span class="n">balance</span><span class="p">):</span> <span class="c1"># constructor</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="c1"># attribute: belongs to THIS object</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acc_no</span> <span class="o">=</span> <span class="n">accountnumber</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bal</span> <span class="o">=</span> <span class="n">balance</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="c1"># Creating three different objects from the same class</span>
<span class="n">acc1</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Rishabh'</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">25000</span><span class="p">)</span>
<span class="n">acc2</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Priya'</span><span class="p">,</span> <span class="mi">102</span><span class="p">,</span> <span class="mi">67548</span><span class="p">)</span>
<span class="n">acc3</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Roshan'</span><span class="p">,</span> <span class="mi">103</span><span class="p">,</span> <span class="mi">76000</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">acc1</span><span class="o">.</span><span class="n">bal</span><span class="p">,</span> <span class="n">acc1</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">acc1</span><span class="o">.</span><span class="n">acc_no</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">acc2</span><span class="o">.</span><span class="n">bal</span><span class="p">,</span> <span class="n">acc2</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">acc2</span><span class="o">.</span><span class="n">acc_no</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">acc3</span><span class="o">.</span><span class="n">bal</span><span class="p">,</span> <span class="n">acc3</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">acc3</span><span class="o">.</span><span class="n">acc_no</span><span class="p">)</span>
</code></pre></div>
<div class="output-card"><pre><code>25000 Rishabh 101
67548 Priya 102
76000 Roshan 103
</code></pre></div>
<h3 id="a-class-can-model-anything">A Class Can Model Anything</h3>
<p>A class isn't limited to bank accounts. Here's a <code>Student</code> class, which reinforces that a class is just a blueprint for whatever entity you need:</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Student</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">roll_number</span><span class="p">,</span> <span class="n">marks</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">roll_no</span> <span class="o">=</span> <span class="n">roll_number</span>
<span class="bp">self</span><span class="o">.</span><span class="n">marks</span> <span class="o">=</span> <span class="n">marks</span>
<span class="k">def</span><span class="w"> </span><span class="nf">is_passing</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">marks</span> <span class="o">>=</span> <span class="mi">50</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_grade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">marks</span> <span class="o">>=</span> <span class="mi">90</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">'A+'</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">marks</span> <span class="o">>=</span> <span class="mi">75</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">'A'</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">marks</span> <span class="o">>=</span> <span class="mi">60</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">'B'</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">marks</span> <span class="o">>=</span> <span class="mi">50</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">'C'</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">'F'</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">s1</span> <span class="o">=</span> <span class="n">Student</span><span class="p">(</span><span class="s1">'Alice'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">92</span><span class="p">)</span>
<span class="n">s2</span> <span class="o">=</span> <span class="n">Student</span><span class="p">(</span><span class="s1">'Bob'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">47</span><span class="p">)</span>
<span class="n">s3</span> <span class="o">=</span> <span class="n">Student</span><span class="p">(</span><span class="s1">'Carol'</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">68</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s1</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'| Grade:'</span><span class="p">,</span> <span class="n">s1</span><span class="o">.</span><span class="n">get_grade</span><span class="p">(),</span> <span class="s1">'| Passing:'</span><span class="p">,</span> <span class="n">s1</span><span class="o">.</span><span class="n">is_passing</span><span class="p">())</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s2</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'| Grade:'</span><span class="p">,</span> <span class="n">s2</span><span class="o">.</span><span class="n">get_grade</span><span class="p">(),</span> <span class="s1">'| Passing:'</span><span class="p">,</span> <span class="n">s2</span><span class="o">.</span><span class="n">is_passing</span><span class="p">())</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s3</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">'| Grade:'</span><span class="p">,</span> <span class="n">s3</span><span class="o">.</span><span class="n">get_grade</span><span class="p">(),</span> <span class="s1">'| Passing:'</span><span class="p">,</span> <span class="n">s3</span><span class="o">.</span><span class="n">is_passing</span><span class="p">())</span>
</code></pre></div>
<div class="output-card"><pre><code>Alice | Grade: A+ | Passing: True
Bob | Grade: F | Passing: False
Carol | Grade: B | Passing: True
</code></pre></div>
<h3 id="__str__-controlling-what-print-shows"><code>__str__</code>: Controlling What <code>print()</code> Shows</h3>
<p>Printing an object without any special setup shows something unhelpful, like <code><__main__.Account object at 0x0000013183...></code>. <code>__str__</code> is a <strong>dunder method</strong> (named for its <strong>d</strong>ouble <strong>under</strong>scores) that controls what appears when you use <code>print()</code> or <code>str()</code> on an object. Python calls it automatically; you don't need to call <code>obj.__str__()</code> yourself.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Account</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">accountnumber</span><span class="p">,</span> <span class="n">balance</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acc_no</span> <span class="o">=</span> <span class="n">accountnumber</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bal</span> <span class="o">=</span> <span class="n">balance</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'Account #</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">acc_no</span><span class="si">}</span><span class="s1"> belongs to </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1"> | Balance: $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">bal</span><span class="si">}</span><span class="s1">'</span>
</code></pre></div>
<p>Think of <code>__str__</code> as the label on a product: without it, all a stranger sees is a box; with it, they see what's actually inside.</p>
<h3 id="amazons-product-class">Amazon's Product Class</h3>
<p>Amazon has over 350 million products, and every one is an object. The <code>Product</code> class defines the shared structure (an <strong>ASIN</strong>, Amazon's unique product ID, title, price, rating), while each object holds the unique data for one specific product.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Product</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asin</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">seller</span><span class="p">,</span> <span class="n">rating</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">review_count</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">asin</span> <span class="o">=</span> <span class="n">asin</span>
<span class="bp">self</span><span class="o">.</span><span class="n">title</span> <span class="o">=</span> <span class="n">title</span>
<span class="bp">self</span><span class="o">.</span><span class="n">price</span> <span class="o">=</span> <span class="n">price</span>
<span class="bp">self</span><span class="o">.</span><span class="n">seller</span> <span class="o">=</span> <span class="n">seller</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rating</span> <span class="o">=</span> <span class="n">rating</span>
<span class="bp">self</span><span class="o">.</span><span class="n">review_count</span> <span class="o">=</span> <span class="n">review_count</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'[</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">asin</span><span class="si">}</span><span class="s1">] </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">title</span><span class="si">}</span><span class="s1"> | $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">price</span><span class="si">}</span><span class="s1"> | </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rating</span><span class="si">:</span><span class="s1">.1f</span><span class="si">}</span><span class="s1">/5 (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">review_count</span><span class="si">}</span><span class="s1"> reviews)'</span>
<span class="k">def</span><span class="w"> </span><span class="nf">apply_discount</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">percent</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">price</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">price</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">percent</span> <span class="o">/</span> <span class="mi">100</span><span class="p">),</span> <span class="mi">2</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_review</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new_rating</span><span class="p">):</span>
<span class="n">total_combined_rating</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rating</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">review_count</span> <span class="o">+</span> <span class="n">new_rating</span>
<span class="bp">self</span><span class="o">.</span><span class="n">review_count</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rating</span> <span class="o">=</span> <span class="n">total_combined_rating</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">review_count</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">laptop</span> <span class="o">=</span> <span class="n">Product</span><span class="p">(</span><span class="s1">'B09G9HDGY2'</span><span class="p">,</span> <span class="s1">'Apple MacBook Pro 14-inch'</span><span class="p">,</span> <span class="mf">1999.99</span><span class="p">,</span> <span class="s1">'Apple Inc.'</span><span class="p">,</span> <span class="mf">4.8</span><span class="p">,</span> <span class="mi">2341</span><span class="p">)</span>
<span class="n">headphones</span> <span class="o">=</span> <span class="n">Product</span><span class="p">(</span><span class="s1">'B07Q9MJKBV'</span><span class="p">,</span> <span class="s1">'Sony WH-1000XM4 Headphones'</span><span class="p">,</span> <span class="mf">279.99</span><span class="p">,</span> <span class="s1">'Sony'</span><span class="p">,</span> <span class="mf">4.7</span><span class="p">,</span> <span class="mi">18923</span><span class="p">)</span>
<span class="n">laptop</span><span class="o">.</span><span class="n">apply_discount</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span> <span class="c1"># Prime Day 15% off</span>
<span class="n">headphones</span><span class="o">.</span><span class="n">add_review</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="c1"># a new 5-star review comes in</span>
<span class="nb">print</span><span class="p">(</span><span class="n">laptop</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">headphones</span><span class="p">)</span>
</code></pre></div>
<div class="output-card"><pre><code>[B09G9HDGY2] Apple MacBook Pro 14-inch | $1699.99 | 4.8/5 (2341 reviews)
[B07Q9MJKBV] Sony WH-1000XM4 Headphones | $279.99 | 4.7/5 (18924 reviews)
</code></pre></div>
<p><code>add_review</code> is worth walking through, because the trick behind it comes up constantly in real systems. Re-reading every rating a product has ever received each time a new one arrives would be far too slow for a product with thousands of reviews, so this method keeps just two running numbers per product: the current average rating and the total review count. When a new review comes in, the method reverse-engineers the historical total from what it already has: <code>total = average × count</code>. For the headphones, that's <code>4.7 × 18923 = 88938.1</code>. Add the new 5-star rating to get <code>88943.1</code>, bump the count to <code>18924</code>, and divide to get the fresh average. Three lines, and the full rating history was never needed.</p>
<p>One detail matters here: the method stores the full-precision average and only rounds it for display, inside <code>__str__</code> (the <code>:.1f</code>). If it stored the rounded <code>4.7</code> back, every later calculation would start from a slightly wrong total, and on a product with thousands of reviews the rounded average could never move at all. Even a thousand new 1-star reviews would leave it stuck at 4.7.</p>
<hr />
<h2 id="2-class-variables-vs-instance-variables"><span class="h-icon"><svg class="icon"><use href="#icon-database"></use></svg></span>2. Class Variables vs. Instance Variables</h2>
<p>There are two kinds of data in a class, and the difference matters:</p>
<div class="table-wrap"><table>
<thead>
<tr>
<th>Type</th>
<th>Defined where</th>
<th>Shared?</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>Instance variable</td>
<td>Inside <code>__init__</code> with <code>self.</code></td>
<td>No, unique per object</td>
<td>customer name, balance</td>
</tr>
<tr>
<td>Class variable</td>
<td>At class level, outside <code>__init__</code></td>
<td>Yes, same for every object</td>
<td>bank name, IFSC code, counter</td>
</tr>
</tbody>
</table></div>
<p><strong>Analogy:</strong> a class variable is a shared whiteboard in an office; every object reads the exact same thing off it. An instance variable is each person's private notebook; every object's copy is independent. Change the whiteboard, and everyone sees the change instantly. Scribble in your own notebook, and nobody else's changes.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Account</span><span class="p">:</span>
<span class="n">counter</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># class variable: shared by every Account</span>
<span class="n">bank_name</span> <span class="o">=</span> <span class="s1">'PyBank'</span> <span class="c1"># class variable: same for all accounts</span>
<span class="n">ifsc_code</span> <span class="o">=</span> <span class="s1">'PYBN0001234'</span> <span class="c1"># class variable: same branch for all</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">balance</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="c1"># instance variable</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acc_no</span> <span class="o">=</span> <span class="n">Account</span><span class="o">.</span><span class="n">counter</span> <span class="c1"># read the shared counter</span>
<span class="n">Account</span><span class="o">.</span><span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span> <span class="c1"># then bump it for the next account</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bal</span> <span class="o">=</span> <span class="n">balance</span> <span class="c1"># instance variable</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'[</span><span class="si">{</span><span class="n">Account</span><span class="o">.</span><span class="n">bank_name</span><span class="si">}</span><span class="s1">] Account #</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">acc_no</span><span class="si">}</span><span class="s1"> | </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1"> | $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">bal</span><span class="si">}</span><span class="s1">'</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">acc1</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Rishabh'</span><span class="p">,</span> <span class="mi">25000</span><span class="p">)</span>
<span class="n">acc2</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Priya'</span><span class="p">,</span> <span class="mi">67548</span><span class="p">)</span>
<span class="n">acc3</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Roshan'</span><span class="p">,</span> <span class="mi">76000</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Total accounts created so far:'</span><span class="p">,</span> <span class="n">Account</span><span class="o">.</span><span class="n">counter</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Bank IFSC Code:'</span><span class="p">,</span> <span class="n">Account</span><span class="o">.</span><span class="n">ifsc_code</span><span class="p">)</span>
</code></pre></div>
<div class="output-card"><pre><code>Total accounts created so far: 3
Bank IFSC Code: PYBN0001234
</code></pre></div>
<p>The <code>counter</code> class variable is what lets the class hand out sequential account numbers automatically, a genuinely useful pattern worth remembering on its own.</p>
<h3 id="ubers-ride-counter-and-surge-pricing">Uber's Ride Counter and Surge Pricing</h3>
<p>Uber processes over 25 million rides a day, with data living at two different levels: <code>total_rides</code> and <code>surge_multiplier</code> are class variables (they apply globally), while the rider, driver, and fare of any specific ride are instance variables.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Ride</span><span class="p">:</span>
<span class="n">total_rides</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># class variable: tracks every ride ever created</span>
<span class="n">surge_multiplier</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="c1"># class variable: changed globally during peak hours</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rider</span><span class="p">,</span> <span class="n">driver</span><span class="p">,</span> <span class="n">pickup</span><span class="p">,</span> <span class="n">destination</span><span class="p">,</span> <span class="n">base_fare</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rider</span> <span class="o">=</span> <span class="n">rider</span>
<span class="bp">self</span><span class="o">.</span><span class="n">driver</span> <span class="o">=</span> <span class="n">driver</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pickup</span> <span class="o">=</span> <span class="n">pickup</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span> <span class="o">=</span> <span class="n">destination</span>
<span class="bp">self</span><span class="o">.</span><span class="n">base_fare</span> <span class="o">=</span> <span class="n">base_fare</span>
<span class="n">Ride</span><span class="o">.</span><span class="n">total_rides</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ride_id</span> <span class="o">=</span> <span class="n">Ride</span><span class="o">.</span><span class="n">total_rides</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_final_fare</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">round</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_fare</span> <span class="o">*</span> <span class="n">Ride</span><span class="o">.</span><span class="n">surge_multiplier</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">ride1</span> <span class="o">=</span> <span class="n">Ride</span><span class="p">(</span><span class="s1">'Alice'</span><span class="p">,</span> <span class="s1">'Carlos'</span><span class="p">,</span> <span class="s1">'Marina District'</span><span class="p">,</span> <span class="s1">'SFO Airport'</span><span class="p">,</span> <span class="mf">45.00</span><span class="p">)</span>
<span class="n">ride2</span> <span class="o">=</span> <span class="n">Ride</span><span class="p">(</span><span class="s1">'Bob'</span><span class="p">,</span> <span class="s1">'Priya'</span><span class="p">,</span> <span class="s1">'Downtown'</span><span class="p">,</span> <span class="s1">'Oakland'</span><span class="p">,</span> <span class="mf">22.50</span><span class="p">)</span>
<span class="c1"># Friday night: surge kicks in. This ONE change affects the fare of every ride, even ride1 and ride2</span>
<span class="n">Ride</span><span class="o">.</span><span class="n">surge_multiplier</span> <span class="o">=</span> <span class="mf">2.3</span>
<span class="n">ride3</span> <span class="o">=</span> <span class="n">Ride</span><span class="p">(</span><span class="s1">'Carol'</span><span class="p">,</span> <span class="s1">'Sam'</span><span class="p">,</span> <span class="s1">'Tenderloin'</span><span class="p">,</span> <span class="s1">'Caltrain'</span><span class="p">,</span> <span class="mf">15.00</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Ride 3 fare with surge: $</span><span class="si">{</span><span class="n">ride3</span><span class="o">.</span><span class="n">get_final_fare</span><span class="p">()</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Total rides so far:'</span><span class="p">,</span> <span class="n">Ride</span><span class="o">.</span><span class="n">total_rides</span><span class="p">)</span>
</code></pre></div>
<div class="output-card"><pre><code>Ride 3 fare with surge: $34.5
Total rides so far: 3
</code></pre></div>
<hr />
<h2 id="3-methods-functions-inside-a-class"><span class="h-icon"><svg class="icon"><use href="#icon-function"></use></svg></span>3. Methods: Functions Inside a Class</h2>
<p>Methods are just functions defined inside a class. They always take <code>self</code> first so they can read and change the object's own data, which is what lets objects <em>do things</em>: deposit money, send a message, play a song.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Account</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">accountnumber</span><span class="p">,</span> <span class="n">balance</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acc_no</span> <span class="o">=</span> <span class="n">accountnumber</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bal</span> <span class="o">=</span> <span class="n">balance</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deposit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
<span class="k">if</span> <span class="n">amount</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bal</span> <span class="o">+=</span> <span class="n">amount</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Deposited $</span><span class="si">{</span><span class="n">amount</span><span class="si">}</span><span class="s2"> to </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">'s account. New balance: $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">bal</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Deposit amount must be positive.'</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">withdraw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
<span class="k">if</span> <span class="n">amount</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Withdraw amount must be positive.'</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">amount</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">bal</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Insufficient funds!'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bal</span> <span class="o">-=</span> <span class="n">amount</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Withdrew $</span><span class="si">{</span><span class="n">amount</span><span class="si">}</span><span class="s2"> from </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">'s account. New balance: $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">bal</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">transfer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">other_account</span><span class="p">):</span>
<span class="k">if</span> <span class="n">amount</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Transfer amount must be positive.'</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">amount</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">bal</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Insufficient funds to transfer!'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">withdraw</span><span class="p">(</span><span class="n">amount</span><span class="p">)</span>
<span class="n">other_account</span><span class="o">.</span><span class="n">deposit</span><span class="p">(</span><span class="n">amount</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Transfer complete.'</span><span class="p">)</span>
</code></pre></div>
<p><code>transfer</code> calls <code>withdraw</code> on itself and <code>deposit</code> on the other account; objects interacting with other objects is exactly how the real world works, and exactly why bundling data with behavior pays off.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">acc1</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Rishabh'</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">25000</span><span class="p">)</span>
<span class="n">acc2</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Priya'</span><span class="p">,</span> <span class="mi">102</span><span class="p">,</span> <span class="mi">67548</span><span class="p">)</span>
<span class="n">acc1</span><span class="o">.</span><span class="n">deposit</span><span class="p">(</span><span class="mi">10000</span><span class="p">)</span>
<span class="n">acc1</span><span class="o">.</span><span class="n">transfer</span><span class="p">(</span><span class="mi">20000</span><span class="p">,</span> <span class="n">acc2</span><span class="p">)</span>
</code></pre></div>
<div class="output-card"><pre><code>Deposited $10000 to Rishabh's account. New balance: $35000
Withdrew $20000 from Rishabh's account. New balance: $15000
Deposited $20000 to Priya's account. New balance: $87548
Transfer complete.
</code></pre></div>
<hr />
<h2 id="4-encapsulation"><span class="h-icon"><svg class="icon"><use href="#icon-lock"></use></svg></span>4. Encapsulation</h2>
<p>Encapsulation means bundling data and methods together, and controlling who can actually access that data.</p>
<h3 id="why-we-need-it">Why We Need It</h3>
<p>Without encapsulation, anyone can reach in and set invalid data directly:</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Account</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">balance</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">balance</span> <span class="o">=</span> <span class="n">balance</span> <span class="c1"># public attribute; anyone can change it</span>
<span class="n">acc</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'Alice'</span><span class="p">,</span> <span class="mi">5000</span><span class="p">)</span>
<span class="n">acc</span><span class="o">.</span><span class="n">balance</span> <span class="o">=</span> <span class="o">-</span><span class="mi">99999999</span> <span class="c1"># nothing stops this; it should never be allowed</span>
</code></pre></div>
<p>Encapsulation fixes this by making attributes private and forcing access through controlled methods.</p>
<h3 id="access-levels-in-python">Access Levels in Python</h3>
<div class="table-wrap"><table>
<thead>
<tr>
<th>Convention</th>
<th>Syntax</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>Public</td>
<td><code>self.name</code></td>
<td>Accessible from anywhere (the default)</td>
</tr>
<tr>
<td>Protected</td>
<td><code>self._name</code></td>
<td>Single underscore: "please don't touch this" (a convention, not enforced)</td>
</tr>
<tr>
<td>Private</td>
<td><code>self.__name</code></td>
<td>Double underscore: name-mangled, harder to reach from outside</td>
</tr>
</tbody>
</table></div>
<p><strong>Analogy:</strong> think of these three levels like rooms in your own house. Public is the front yard, anyone walking by can see it. Protected is the living room, meant for family and close friends, though a stranger who lets themselves in technically still could. Private is a locked diary in your room: nobody's supposed to read it, but a determined person who really wants to could still pick the lock. That last point matters more than it sounds: <strong>Python doesn't truly block access to private attributes.</strong> It uses <strong>name mangling</strong>, quietly renaming <code>self.__balance</code> to <code>self._Account__balance</code> internally. You can still reach it from outside, but only by deliberately going out of your way, which is exactly the point: the double underscore is a strong "keep out" sign, not an unbreakable lock.</p>
<h3 id="getters-and-setters">Getters and Setters</h3>
<p>Since private attributes aren't meant to be accessed directly from outside the class, controlled access comes through two kinds of methods: a <strong>getter</strong> reads and returns the private value, and a <strong>setter</strong> writes it, but only after validating what's being written.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Account</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">balance</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">=</span> <span class="n">balance</span> <span class="c1"># private</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deposit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
<span class="k">if</span> <span class="n">amount</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">+=</span> <span class="n">amount</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_balance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="c1"># getter: safe read</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__balance</span>
<span class="k">def</span><span class="w"> </span><span class="nf">set_balance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span> <span class="c1"># setter: write WITH validation</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">))</span> <span class="ow">and</span> <span class="n">amount</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">=</span> <span class="n">amount</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Balance updated to $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">__balance</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Invalid amount. Balance must be a non-negative number.'</span><span class="p">)</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">account</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="s1">'John Doe'</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Current balance: $</span><span class="si">{</span><span class="n">account</span><span class="o">.</span><span class="n">get_balance</span><span class="p">()</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="n">account</span><span class="o">.</span><span class="n">set_balance</span><span class="p">(</span><span class="s1">'abc'</span><span class="p">)</span> <span class="c1"># rejected: not a number</span>
<span class="n">account</span><span class="o">.</span><span class="n">set_balance</span><span class="p">(</span><span class="o">-</span><span class="mi">500</span><span class="p">)</span> <span class="c1"># rejected: negative</span>
<span class="n">account</span><span class="o">.</span><span class="n">set_balance</span><span class="p">(</span><span class="mi">9999</span><span class="p">)</span> <span class="c1"># accepted</span>
</code></pre></div>
<div class="output-card"><pre><code>Current balance: $100
Invalid amount. Balance must be a non-negative number.
Invalid amount. Balance must be a non-negative number.
Balance updated to $9999
</code></pre></div>
<p>The name-mangling behavior mentioned earlier is easy to see directly on this same object:</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="nb">print</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">__balance</span><span class="p">)</span> <span class="c1"># fails: this exact name doesn't exist</span>
</code></pre></div>
<div class="output-card"><pre><code>AttributeError: 'Account' object has no attribute '__balance'
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="nb">print</span><span class="p">(</span><span class="n">account</span><span class="o">.</span><span class="n">_Account__balance</span><span class="p">)</span> <span class="c1"># works: this is the REAL, mangled name</span>
</code></pre></div>
<div class="output-card"><pre><code>9999
</code></pre></div>
<p>The setter is the gatekeeper here. It's the same idea as a bank teller: you don't reach into the vault yourself, you ask the teller, and the teller checks the rules before touching anything.</p>
<h3 id="apples-credit-card-encapsulated-financial-data">Apple's Credit Card: Encapsulated Financial Data</h3>
<p>When you add a card to Apple Wallet, Apple never stores or displays your full card number; the real number stays private, and the app only ever shows the last four digits. Stripe follows the same pattern with tokenization, covered later in this guide.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">CreditCard</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">holder_name</span><span class="p">,</span> <span class="n">card_number</span><span class="p">,</span> <span class="n">cvv</span><span class="p">,</span> <span class="n">credit_limit</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">holder_name</span> <span class="o">=</span> <span class="n">holder_name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__card_number</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">card_number</span><span class="p">)</span> <span class="c1"># private, never exposed in full</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__cvv</span> <span class="o">=</span> <span class="n">cvv</span> <span class="c1"># private</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__credit_limit</span> <span class="o">=</span> <span class="n">credit_limit</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_masked_number</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'**** **** **** </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">__card_number</span><span class="p">[</span><span class="o">-</span><span class="mi">4</span><span class="p">:]</span><span class="si">}</span><span class="s1">'</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_available_credit</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__credit_limit</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">__balance</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_utilization</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">round</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">__credit_limit</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">charge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">merchant</span><span class="p">):</span>
<span class="k">if</span> <span class="n">amount</span> <span class="o"><=</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">amount</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">get_available_credit</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Declined at </span><span class="si">{</span><span class="n">merchant</span><span class="si">}</span><span class="s1">.'</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">+=</span> <span class="n">amount</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Approved: $</span><span class="si">{</span><span class="n">amount</span><span class="si">}</span><span class="s1"> at </span><span class="si">{</span><span class="n">merchant</span><span class="si">}</span><span class="s1"> | Remaining credit: $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">get_available_credit</span><span class="p">()</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">def</span><span class="w"> </span><span class="nf">pay_bill</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
<span class="n">payment</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__balance</span><span class="p">)</span> <span class="c1"># can't ever overpay</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">-=</span> <span class="n">payment</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Payment of $</span><span class="si">{</span><span class="n">payment</span><span class="si">}</span><span class="s1"> received. Remaining balance: $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">__balance</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'Card: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">get_masked_number</span><span class="p">()</span><span class="si">}</span><span class="s1"> | </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">holder_name</span><span class="si">}</span><span class="s1"> | Utilization: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">get_utilization</span><span class="p">()</span><span class="si">}</span><span class="s1">%'</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">card</span> <span class="o">=</span> <span class="n">CreditCard</span><span class="p">(</span><span class="s1">'John Doe'</span><span class="p">,</span> <span class="s1">'4111111111111234'</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">5000</span><span class="p">)</span>
<span class="n">card</span><span class="o">.</span><span class="n">charge</span><span class="p">(</span><span class="mi">1500</span><span class="p">,</span> <span class="s1">'Amazon'</span><span class="p">)</span>
<span class="n">card</span><span class="o">.</span><span class="n">charge</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="s1">'Apple Store'</span><span class="p">)</span>
<span class="n">card</span><span class="o">.</span><span class="n">charge</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="s1">'Best Buy'</span><span class="p">)</span> <span class="c1"># should be declined</span>
<span class="nb">print</span><span class="p">(</span><span class="n">card</span><span class="p">)</span>
<span class="n">card</span><span class="o">.</span><span class="n">pay_bill</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span>
</code></pre></div>
<div class="output-card"><pre><code>Approved: $1500 at Amazon | Remaining credit: $3500
Approved: $2000 at Apple Store | Remaining credit: $1500
Declined at Best Buy.
Card: **** **** **** 1234 | John Doe | Utilization: 70.0%
Payment of $1000 received. Remaining balance: $2500
</code></pre></div>
<p>Every getter here exposes a <em>calculated</em> value (a masked number, a percentage) without ever revealing the private data it was computed from.</p>
<hr />
<h2 id="5-inheritance"><span class="h-icon"><svg class="icon"><use href="#icon-tree"></use></svg></span>5. Inheritance</h2>
<p>Inheritance lets a new class (the <strong>child</strong> or <strong>subclass</strong>) reuse and extend the code of an existing class (the <strong>parent</strong> or <strong>superclass</strong>). It models the "is-a" relationship: a <code>SavingsAccount</code> <em>is an</em> <code>Account</code>. Without inheritance, <code>deposit()</code> and <code>withdraw()</code> would need to be copy-pasted into every account type; with it, you write them once in the parent and every child gets them automatically.</p>
<h3 id="super-calling-the-parents-method"><code>super()</code>: Calling the Parent's Method</h3>
<p>When a child class defines its own <code>__init__</code>, it usually still needs the parent's <code>__init__</code> to run, so the parent's attributes get set up properly. <code>super()</code> does exactly that:</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">CurrentAccount</span><span class="p">(</span><span class="n">Account</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">acc_no</span><span class="p">,</span> <span class="n">balance</span><span class="p">,</span> <span class="n">gender</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">acc_no</span><span class="p">,</span> <span class="n">balance</span><span class="p">)</span> <span class="c1"># run Account's setup first</span>
<span class="bp">self</span><span class="o">.</span><span class="n">gender</span> <span class="o">=</span> <span class="n">gender</span> <span class="c1"># then add the child's own data</span>
</code></pre></div>
<p>Think of <code>super()</code> as passing work up the chain: let the parent handle what it already knows how to do, then add whatever is specific to the child on top.</p>
<h3 id="the-five-types-of-inheritance">The Five Types of Inheritance</h3>
<ol>
<li><strong>Single</strong>: one child inherits from one parent.</li>
<li><strong>Multiple</strong>: one child inherits from two or more parents.</li>
<li><strong>Multilevel</strong>: a chain, grandparent → parent → child.</li>
<li><strong>Hierarchical</strong>: multiple children inherit from the same parent.</li>
<li><strong>Hybrid</strong>: a mix of the patterns above.</li>
</ol>
<h3 id="51-single-inheritance">5.1 Single Inheritance</h3>
<p>One parent, one child, nothing more. <code>SavingsAccount</code> reuses everything <code>Account</code> already does, and adds a small transaction limit of its own on top:</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Account</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">accountnumber</span><span class="p">,</span> <span class="n">balance</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acc_no</span> <span class="o">=</span> <span class="n">accountnumber</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bal</span> <span class="o">=</span> <span class="n">balance</span>
<span class="bp">self</span><span class="o">.</span><span class="n">numtrans</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># transactions done today</span>
<span class="bp">self</span><span class="o">.</span><span class="n">maxtrans</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1"># max transactions allowed per day</span>
<span class="k">def</span><span class="w"> </span><span class="nf">deposit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
<span class="k">if</span> <span class="n">amount</span> <span class="o">></span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">numtrans</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxtrans</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bal</span> <span class="o">+=</span> <span class="n">amount</span>
<span class="bp">self</span><span class="o">.</span><span class="n">numtrans</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Deposited $</span><span class="si">{</span><span class="n">amount</span><span class="si">}</span><span class="s1">. Balance: $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">bal</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">numtrans</span> <span class="o">>=</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxtrans</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Transaction limit reached for today.'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Deposit amount must be positive.'</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">SavingsAccount</span><span class="p">(</span><span class="n">Account</span><span class="p">):</span>
<span class="k">pass</span> <span class="c1"># 'pass' means no extra code: it uses everything from Account, unchanged</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">sav1</span> <span class="o">=</span> <span class="n">SavingsAccount</span><span class="p">(</span><span class="s1">'Vinay'</span><span class="p">,</span> <span class="mi">301</span><span class="p">,</span> <span class="mi">90800</span><span class="p">)</span>
<span class="n">sav1</span><span class="o">.</span><span class="n">deposit</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span> <span class="c1"># transaction 1</span>
<span class="n">sav1</span><span class="o">.</span><span class="n">deposit</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span> <span class="c1"># transaction 2</span>
<span class="n">sav1</span><span class="o">.</span><span class="n">deposit</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span> <span class="c1"># refused: the daily limit is 2</span>
</code></pre></div>
<div class="output-card"><pre><code>Deposited $5000. Balance: $95800
Deposited $5000. Balance: $100800
Transaction limit reached for today.
</code></pre></div>
<p><code>SavingsAccount</code> gets <code>deposit()</code>, the transaction counter, everything, entirely for free. The moment a <em>second</em> class also starts inheriting from the same parent (section 5.4 shows three classes sharing <code>BankAccount</code>), the pattern has become hierarchical rather than single, since single inheritance describes one parent feeding exactly one child.</p>
<h3 id="52-multiple-inheritance">5.2 Multiple Inheritance</h3>
<p>A child can inherit from several parents at once. A Tesla is a <code>Vehicle</code>, an <code>ElectricVehicle</code>, <em>and</em> uses <code>GPSNavigator</code>, all at the same time:</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Vehicle</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">make</span><span class="p">,</span> <span class="n">model</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">make</span> <span class="o">=</span> <span class="n">make</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span>
<span class="k">def</span><span class="w"> </span><span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">make</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s1"> is starting...'</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ElectricVehicle</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">battery_kwh</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">battery</span> <span class="o">=</span> <span class="n">battery_kwh</span>
<span class="bp">self</span><span class="o">.</span><span class="n">charge_level</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_range</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">miles</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">battery</span> <span class="o">*</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">charge_level</span> <span class="o">/</span> <span class="mi">100</span><span class="p">)</span> <span class="o">*</span> <span class="mf">2.5</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">miles</span><span class="si">}</span><span class="s1"> miles'</span>
<span class="k">class</span><span class="w"> </span><span class="nc">GPSNavigator</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_location</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'37.7749 N, 122.4194 W'</span>
<span class="k">def</span><span class="w"> </span><span class="nf">navigate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">destination</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'Routing to </span><span class="si">{</span><span class="n">destination</span><span class="si">}</span><span class="s1"> from </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">get_location</span><span class="p">()</span><span class="si">}</span><span class="s1">'</span>
<span class="k">class</span><span class="w"> </span><span class="nc">TeslaModel3</span><span class="p">(</span><span class="n">Vehicle</span><span class="p">,</span> <span class="n">ElectricVehicle</span><span class="p">,</span> <span class="n">GPSNavigator</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">autopilot</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="n">Vehicle</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'Tesla'</span><span class="p">,</span> <span class="n">model</span><span class="p">)</span>
<span class="n">ElectricVehicle</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">battery_kwh</span><span class="o">=</span><span class="mi">75</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">autopilot</span> <span class="o">=</span> <span class="n">autopilot</span>
<span class="k">def</span><span class="w"> </span><span class="nf">self_drive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">destination</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">autopilot</span><span class="p">:</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'Autopilot engaged. </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">navigate</span><span class="p">(</span><span class="n">destination</span><span class="p">)</span><span class="si">}</span><span class="s1"> | Range: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">get_range</span><span class="p">()</span><span class="si">}</span><span class="s1">'</span>
<span class="k">return</span> <span class="s1">'Autopilot not available.'</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">tesla</span> <span class="o">=</span> <span class="n">TeslaModel3</span><span class="p">(</span><span class="s1">'Model 3'</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">tesla</span><span class="o">.</span><span class="n">start</span><span class="p">())</span> <span class="c1"># from Vehicle</span>
<span class="nb">print</span><span class="p">(</span><span class="n">tesla</span><span class="o">.</span><span class="n">get_range</span><span class="p">())</span> <span class="c1"># from ElectricVehicle</span>
<span class="nb">print</span><span class="p">(</span><span class="n">tesla</span><span class="o">.</span><span class="n">self_drive</span><span class="p">(</span><span class="s1">'Palo Alto'</span><span class="p">))</span> <span class="c1"># TeslaModel3's own method, using methods from ALL parents</span>
</code></pre></div>
<div class="output-card"><pre><code>Tesla Model 3 is starting...
187 miles
Autopilot engaged. Routing to Palo Alto from 37.7749 N, 122.4194 W | Range: 187 miles
</code></pre></div>
<h3 id="53-multilevel-inheritance">5.3 Multilevel Inheritance</h3>
<p>A chain, where each level adds more specific behavior than the one before it:</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">Animal</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="nf">breathe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'Breathing oxygen.'</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Mammal</span><span class="p">(</span><span class="n">Animal</span><span class="p">):</span> <span class="c1"># Mammal IS an Animal</span>
<span class="k">def</span><span class="w"> </span><span class="nf">feed_young_with_milk</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'Feeding young with milk.'</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Dog</span><span class="p">(</span><span class="n">Mammal</span><span class="p">):</span> <span class="c1"># Dog IS a Mammal (which is also an Animal)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">bark</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'Woof!'</span>
</code></pre></div>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="n">dog</span> <span class="o">=</span> <span class="n">Dog</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">dog</span><span class="o">.</span><span class="n">breathe</span><span class="p">())</span> <span class="c1"># inherited from Animal, two levels up</span>
<span class="nb">print</span><span class="p">(</span><span class="n">dog</span><span class="o">.</span><span class="n">feed_young_with_milk</span><span class="p">())</span> <span class="c1"># inherited from Mammal, one level up</span>
<span class="nb">print</span><span class="p">(</span><span class="n">dog</span><span class="o">.</span><span class="n">bark</span><span class="p">())</span> <span class="c1"># Dog's own method</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">dog</span><span class="p">,</span> <span class="n">Dog</span><span class="p">),</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dog</span><span class="p">,</span> <span class="n">Mammal</span><span class="p">),</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dog</span><span class="p">,</span> <span class="n">Animal</span><span class="p">))</span>
</code></pre></div>
<div class="output-card"><pre><code>Breathing oxygen.
Feeding young with milk.
Woof!
True True True
</code></pre></div>
<p><code>isinstance()</code> confirming <code>True</code> all the way up the chain is the clearest proof that a <code>Dog</code> really is a <code>Mammal</code> and an <code>Animal</code> simultaneously, not just something that happens to share a few methods with them.</p>
<h3 id="54-hierarchical-inheritance">5.4 Hierarchical Inheritance</h3>
<p>Multiple children sharing one parent. This is the pattern a real bank actually needs: several account types, all built on the same core.</p>
<div class="code-card"><div class="code-head"><div class="dots"><span></span><span></span><span></span></div><span class="lang">python</span><button class="copy-btn" type="button"><svg class="icon"><use href="#icon-copy"></use></svg>Copy</button></div><pre><code><span class="k">class</span><span class="w"> </span><span class="nc">BankAccount</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">holder</span><span class="p">,</span> <span class="n">acc_no</span><span class="p">,</span> <span class="n">balance</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">holder</span> <span class="o">=</span> <span class="n">holder</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acc_no</span> <span class="o">=</span> <span class="n">acc_no</span>
<span class="bp">self</span><span class="o">.</span><span class="n">balance</span> <span class="o">=</span> <span class="n">balance</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s1"> | </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">holder</span><span class="si">}</span><span class="s1"> | $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">balance</span><span class="si">}</span><span class="s1">'</span>
<span class="k">class</span><span class="w"> </span><span class="nc">SavingsAccount</span><span class="p">(</span><span class="n">BankAccount</span><span class="p">):</span>
<span class="n">interest_rate</span> <span class="o">=</span> <span class="mf">0.04</span>
<span class="k">def</span><span class="w"> </span><span class="nf">apply_interest</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">earned</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">balance</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">interest_rate</span>
<span class="bp">self</span><span class="o">.</span><span class="n">balance</span> <span class="o">+=</span> <span class="n">earned</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Interest earned: $</span><span class="si">{</span><span class="nb">round</span><span class="p">(</span><span class="n">earned</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s1">. New balance: $</span><span class="si">{</span><span class="nb">round</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">balance</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">CurrentAccount</span><span class="p">(</span><span class="n">BankAccount</span><span class="p">):</span>
<span class="n">overdraft_limit</span> <span class="o">=</span> <span class="mi">10000</span>
<span class="k">def</span><span class="w"> </span><span class="nf">withdraw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
<span class="k">if</span> <span class="n">amount</span> <span class="o"><=</span> <span class="bp">self</span><span class="o">.</span><span class="n">balance</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">overdraft_limit</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">balance</span> <span class="o">-=</span> <span class="n">amount</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Withdrew $</span><span class="si">{</span><span class="n">amount</span><span class="si">}</span><span class="s1">. Balance: $</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">balance</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Amount exceeds overdraft limit.'</span><span class="p">)</span>