forked from yazbel/python-istihza
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnesne_tabanli_programlama5.html
1138 lines (990 loc) · 99.4 KB
/
nesne_tabanli_programlama5.html
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="tr">
<html lang="tr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<meta content="Bu bölümde nesne tabanlı programlamadan söz edeceğiz." name="description" />
<meta content="python, python3, nesne, oop, sınıf, class, miras alma, inheritance, nesne yönelimli programlama, nesne tabanlı programlama, object oriented programming, self, instantiation, instance, örnek, örneklendirme, örnekleme" name="keywords" />
<title>Nesne Tabanlı Programlama (Devamı) — Python 3 için Türkçe Kılavuz</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/pyramid.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/translations.js"></script>
<link rel="search" title="Ara" href="search.html" />
<link rel="next" title="Nesne Tabanlı Programlama (Devamı)" href="nesne_tabanli_programlama6.html" />
<link rel="prev" title="Nesne Tabanlı Programlama (Devamı)" href="nesne_tabanli_programlama4.html" />
<!--[if lte IE 6]>
<link rel="stylesheet" href="_static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]-->
</head><body>
<div class='header'><a href='https://yazbel.com'><img src="_static/logo.png"></a></div>
<ul class='navbar'>
<li><a href="#"><del>pdf desteği sonlanmıştır</del></a></li>
<li class="forum"><a href="http://forum.yazbel.com">forum</a></li>
</ul>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="nesne_tabanli_programlama6.html" title="Nesne Tabanlı Programlama (Devamı)"
accesskey="N">sonraki</a></li>
<li class="right" >
<a href="nesne_tabanli_programlama4.html" title="Nesne Tabanlı Programlama (Devamı)"
accesskey="P">önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Nesne Tabanlı Programlama (Devamı)</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="body" role="main">
<section id="nesne-tabanli-programlama-devami">
<h1>Nesne Tabanlı Programlama (Devamı)<a class="headerlink" href="#nesne-tabanli-programlama-devami" title="Bu başlık için kalıcı bağlantı">¶</a></h1>
<p>Nesne tabanlı programlamaya giriş yaparken, bu programlama yaklaşımının oldukça
geniş kapsamlı bir konu olduğunu söylemiştik. Bu bölümde de bu geniş kapsamlı
konunun ileri düzey yönlerini ele almaya devam edeceğiz.</p>
<p>Ayrıca bu bölümü bitirdikten sonra, nesne tabanlı programlamanın yoğun bir
şekilde kullanıldığı ‘grafik arayüz tasarlama’ konusundan da söz edebileceğiz.
Böylece, bu zamana kadar gördüğümüz komut satırı uygulamalarından sonra, bu
bölümle birlikte ilk kez düğmeli-menülü modern arayüzleri tanımaya da
başlayacağız. Üstelik grafik arayüzlü programlar üzerinde çalışmak, nesne
tabanlı programlamanın özellikle karmaşık yönlerini çok daha kolay ve net bir
şekilde anlamamızı da sağlayacak.</p>
<section id="miras-alma">
<h2>Miras Alma<a class="headerlink" href="#miras-alma" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bu bölümde, yine nesne tabanlı programlamaya ait bir kavram olan ‘miras alma’dan
söz edeceğiz. Bütün ayrıntılarıyla ele alacağımız miras alma, nesne tabanlı
programlamanın en önemli konularından birisidir. Hatta nesne tabanlı
programlamayı faydalı bir programlama yaklaşımı haline getiren özelliklerin
başında miras alma gelir dersek çok da abartmış olmayız. Ayrıca miras alma
konusu, komut satırında çalışan programların yanı sıra grafik arayüzlü programlar
da yazabilmemizin önündeki son engel olacak. Bu bölümü tamamladıktan sonra,
grafik arayüzlü programlar yazmamızı sağlayacak özel modüllerin belgelerinden
yararlanabilmeye ve grafik arayüzlü programların kodlarını okuyup anlamaya
başlayabileceğiz.</p>
<p>Daha önce de söylediğimiz gibi, Python programlama dilinin temel felsefesi, bir
kez yazılan kodları en verimli şekilde tekrar tekrar kullanabilmeye dayanır.
Genel olarak baktığımızda dilin hemen hemen bütün öğeleri bu amaca hizmet edecek
şekilde tasarlanmıştır. İşte bu başlık altında ele alacağımız ‘miras alma’
kavramı da kodların tekrar tekrar kullanılabilmesi felsefesine katkı sunan bir
özelliktir.</p>
<p>İsterseniz miras alma konusunu anlatmaya basit bir örnekle başlayalım.</p>
<p>Diyelim ki bir oyun yazıyorsunuz. Bu oyun içinde askerler, işçiler, yöneticiler,
krallar, kraliçeler ve bunun gibi oyuncu türleri olacak. Bu oyuncuları ve
kabiliyetlerini mesela şöyle tanımlayabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">70</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">20</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada asker, işçi ve yöneticinin her biri için ayrı bir sınıf tanımladık. Her
sınıfın bir ismi, rütbesi ve gücü var. Ayrıca her sınıf; hareket etme, puan
kazanma ve puan kaybetme gibi kabiliyetlere sahip.</p>
<p>Bu kodların <cite>oyuncular.py</cite> adlı bir dosyada bulunduğunu varsayarsak, mesela bir
asker oluşturmak için yukarıdaki kodları şöyle kullanabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">oyuncular</span>
<span class="gp">>>> </span><span class="n">asker1</span> <span class="o">=</span> <span class="n">oyuncular</span><span class="o">.</span><span class="n">Asker</span><span class="p">(</span><span class="s1">'Mehmet'</span><span class="p">,</span> <span class="s1">'er'</span><span class="p">)</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfının <cite>isim</cite> ve <cite>rütbe</cite> parametrelerini belirtmek suretiyle bir
asker nesnesi oluşturduk. Tıpkı Python’da gördüğümüz başka nesneler gibi, bu
nesne de çeşitli nitelik ve metotlardan oluşuyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="n">asker1</span><span class="p">)</span>
<span class="go">['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',</span>
<span class="go"> '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',</span>
<span class="go"> '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__',</span>
<span class="go"> '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',</span>
<span class="go"> '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'güç',</span>
<span class="go"> 'hareket_et', 'isim', 'puan_kaybet', 'puan_kazan', 'rütbe']</span>
</pre></div>
</div>
<p>Bu nitelik ve metotları asker nesnesi üzerine nasıl uygulayacağımızı
biliyorsunuz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">isim</span>
<span class="go">'Mehmet'</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">rütbe</span>
<span class="go">'er'</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">güç</span>
<span class="go">100</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">hareket_et</span><span class="p">()</span>
<span class="go">'hareket ediliyor...'</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">puan_kazan</span><span class="p">()</span>
<span class="go">'puan kazanıldı'</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">puan_kaybet</span><span class="p">()</span>
<span class="go">'puan kaybedildi'</span>
</pre></div>
</div>
<p>Aynı şekilde öteki <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> sınıflarını da örnekleyip
kullanabiliriz. Bu konuda bir problem yok. Ancak yukarıdaki kodları
incelediğinizde, aynı kodların sürekli tekrarlandığını göreceksiniz. Gördüğünüz
gibi, aynı nitelik ve metotları her sınıf için yeniden tanımlıyoruz. Bu durumun
Python’ın mantalitesine aykırı olduğunu tahmin etmek hiç zor değil. Peki acaba
yukarıdaki kodları nasıl daha ‘Pythonvari’ hale getirebiliriz?</p>
<p>Bu noktada ilk olarak taban sınıflardan söz etmemiz gerekiyor.</p>
</section>
<section id="taban-siniflar">
<h2>Taban Sınıflar<a class="headerlink" href="#taban-siniflar" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Taban sınıflar (<em>base classes</em>) miras alma konusunun önemli kavramlarından
biridir. Dilerseniz taban sınıfın ne olduğu anlayabilmek için, yukarıda
verdiğimiz örneği temel alarak çok basit bir uygulama yapalım.</p>
<p>Öncelikle yukarıda verdiğimiz örneği tekrar önümüze alalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">70</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">20</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu örnekte, <code class="docutils literal notranslate"><span class="pre">Asker()</span></code>, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> adlı sınıfların içeriğine
baktığımızda pek çok metot ve niteliğin aslında birbiriyle aynı olduğunu
görüyoruz. Gelin isterseniz bütün sınıflarda ortak olan bu nitelik ve metotları
tek bir sınıf altında toplayalım.</p>
<p><code class="docutils literal notranslate"><span class="pre">Asker()</span></code>, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> sınıflarının, yazdığımız programdaki
oyuncuları temsil ettiğini düşünürsek, ortak nitelik ve metotları barındıran
sınıfımızı da <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> olarak adlandırmamız mantıksız olmayacaktır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
</pre></div>
</div>
<p>İşte burada <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı sınıf, bir ‘taban sınıf’ olarak adlandırılır.
Taban sınıf denen şey, birkaç farklı sınıfta ortak olan nitelik ve metotları
barındıran bir sınıf türüdür. İngilizcede <em>base class</em> olarak adlandırılan taban
sınıflar, ayrıca üst sınıf (<em>super class</em>) veya ebeveyn sınıf (<em>parent class</em>)
olarak da adlandırılır. Biz bu makalede taban sınıf ismini tercih edeceğiz.</p>
<p>Yukarıdaki <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı taban sınıf da, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code>, <code class="docutils literal notranslate"><span class="pre">Asker()</span></code>,
<code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> gibi sınıfların hepsinde ortak olarak bulunacak nitelik ve
metotları barındıracak. Öteki bütün sınıflar, ortak nitelik ve metotlarını her
defasında tek tek yeniden tanımlamak yerine, <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı bu taban sınıftan
devralacak. Peki ama nasıl? İşte bunu anlamak için de ‘alt sınıf’ adlı bir
kavrama değinmemiz gerekiyor.</p>
</section>
<section id="alt-siniflar">
<h2>Alt Sınıflar<a class="headerlink" href="#alt-siniflar" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bir taban sınıftan türeyen bütün sınıflar, o taban sınıfın alt sınıflarıdır.
(<em>subclass</em>). Alt sınıflar, kendilerinden türedikleri taban sınıfların metot ve
niteliklerini miras yoluyla devralır.</p>
<p>Anlattığımız bu soyut şeyleri anlamanın en kolay yolu somut bir örnek üzerinden
ilerlemektir. Mesela, biraz önce tanımladığımız <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı taban sınıftan
bir alt sınıf türetelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Kodlarımız tam olarak şöyle görünüyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfını tanımlarken, bu sınıfın parantezleri içine
<code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> sınıfının adını yazdığımıza dikkat edin. İşte bu şekilde bir
sınıfın parantezleri içinde başka bir sınıfın adını belirtirsek, o sınıf,
parantez içinde belirttiğimiz sınıfın bir alt sınıfı olmuş olur. Yani mesela
yukarıdaki gibi <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfının parantezleri arasına <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code>
sınıfının adını yazdığımızda, <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> adlı sınıf;</p>
<blockquote>
<div><ol class="arabic simple">
<li><p><code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı sınıfı miras almış,</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı sınıfın bütün metot ve niteliklerini devralmış,</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı sınıftan türemiş oluyor.</p></li>
</ol>
</div></blockquote>
<p>Bu sayede <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> sınıfında tanımlanan bütün nitelik ve metotlara
<code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfından da erişebiliyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">oyuncular</span>
<span class="gp">>>> </span><span class="n">asker1</span> <span class="o">=</span> <span class="n">oyuncular</span><span class="o">.</span><span class="n">Asker</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">,</span> <span class="s1">'Er'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">isim</span>
<span class="go">'Ahmet'</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">rütbe</span>
<span class="go">'Er'</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">güç</span>
<span class="go">0</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">puan_kazan</span><span class="p">()</span>
<span class="go">'puan kazanıldı'</span>
</pre></div>
</div>
<p>Örnek olması açısından, <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> sınıfından türeyen (miras alan) birkaç alt
sınıf daha tanımlayalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Tanımladığımız bu <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> sınıfları da tıpkı <code class="docutils literal notranslate"><span class="pre">Asker()</span></code>
sınıfı gibi <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı sınıftan miras aldığı için, <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> sınıfının
sahip olduğu tüm nitelik ve metotlara sahiptirler.</p>
<p>Buraya kadar anlattıklarımızı özetleyecek olursak, şu sınıf bir taban sınıftır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu taban sınıf, kendisinden türeyecek alt sınıfların ortak nitelik ve
metotlarını tanımlar.</p>
<p>Şu sınıflar ise, yukarıdaki taban sınıftan türeyen birer alt sınıftır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Bu alt sınıflar, <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı taban sınıfın bütün nitelik ve metotlarını
miras yoluyla devralır. Yani <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı taban/ebeveyn/üst sınıfın nitelik
ve metotlarına, <code class="docutils literal notranslate"><span class="pre">Asker()</span></code>, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> adlı alt sınıflardan
erişebiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">asker1</span> <span class="o">=</span> <span class="n">Asker</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">,</span> <span class="s1">'İstihkamcı'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">işçi1</span> <span class="o">=</span> <span class="n">İşçi</span><span class="p">(</span><span class="s1">'Mehmet'</span><span class="p">,</span> <span class="s1">'Usta'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">yönetici1</span> <span class="o">=</span> <span class="n">Yönetici</span><span class="p">(</span><span class="s1">'Selim'</span><span class="p">,</span> <span class="s1">'Müdür'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">asker1</span><span class="o">.</span><span class="n">hareket_et</span><span class="p">()</span>
<span class="go">'hareket ediliyor...'</span>
<span class="gp">>>> </span><span class="n">işçi1</span><span class="o">.</span><span class="n">puan_kaybet</span><span class="p">()</span>
<span class="go">'puan kaybedildi'</span>
<span class="gp">>>> </span><span class="n">yönetici1</span><span class="o">.</span><span class="n">puan_kazan</span><span class="p">()</span>
<span class="go">'puan kazanıldı'</span>
</pre></div>
</div>
<p>İşte bu mekanizmaya miras alma (<em>inheritance</em>) adı verilir. Miras alma
mekanizması, bir kez yazılan kodların farklı yerlerde kullanılabilmesini
sağlayan, bu bakımdan da programcıyı kod tekrarına düşmekten kurtaran oldukça
faydalı bir araçtır. İlerleyen sayfalarda miras alma mekanizmasının başka
faydalarını da göreceğiz.</p>
</section>
<section id="miras-alma-turleri">
<h2>Miras Alma Türleri<a class="headerlink" href="#miras-alma-turleri" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Tahmin edebileceğiniz gibi, miras alma yalnızca bir sınıfın parantezleri arasına
başka bir sınıfı yazarak ilgili sınıfın bütün nitelik ve metotlarını kayıtsız
şartsız devralmaktan ibaret değildir. Bir sınıf, muhtemelen, miras aldığı
nitelik ve metotlar üzerinde birtakım değişiklikler de yapmak isteyecektir.
Esasında miras alma mekanizmasının işleyişi bakımından kabaca üç ihtimalden söz
edebiliriz:</p>
<ol class="arabic simple">
<li><p>Miras alınan sınıfın bütün nitelik ve metotları alt sınıfa olduğu gibi
devredilir.</p></li>
<li><p>Miras alınan sınıfın bazı nitelik ve metotları alt sınıfta yeniden
tanımlanır.</p></li>
<li><p>Miras alınan sınıfın bazı nitelik ve metotları alt sınıfta değişikliğe
uğratılır.</p></li>
</ol>
<p>Bu ihtimallerden ilkini zaten görmüştük. Bir sınıfın parantezleri arasına başka
bir sınıfın adını yazdıktan sonra eğer alt sınıfta herhangi bir değişiklik
yapmazsak, taban sınıftaki nitelik ve metotlar olduğu gibi alt sınıflara
aktarılacaktır.</p>
<p>Mesela:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfı, miras aldığı <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> sınıfının sanki bir kopyası
gibidir. Dolayısıyla <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> sınıfının bütün nitelik ve metotlarına
<code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfı altından da aynen erişebiliriz.</p>
<p>Yani yukarıdaki kod, <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı sınıfın bütün nitelik ve metotlarının
<code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfı tarafından miras alınmasını sağlar. Bu şekilde, <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code>
sınıfı içinde hangi metot veya nitelik nasıl tanımlanmışsa, <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfına
da o şekilde devredilir.</p>
<p>Taban sınıfımızın şu şekilde tanımlandığını biliyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
</pre></div>
</div>
<p>Dolayısıyla bu taban sınıfta hangi nitelik ve metotlar hangi değerlere sahipse
aşağıdaki <code class="docutils literal notranslate"><span class="pre">Asker()</span></code>, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> sınıfları da o değerlere
sahip olacaktır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Ancak, dediğimiz gibi, miras almada tek seçenek bütün metot ve nitelikleri
olduğu gibi alt sınıflara aktarmak değildir. Zaten öyle olsaydı miras alma
mekanizmasının pek bir anlamı olmazdı. Biz miras aldığımız sınıflar üzerinde,
içinde bulunduğumuz durumun gerektirdiği birtakım değişiklikleri yapabilmeliyiz
ki bu mekanizmanın ilgi çekici bir yanı olsun.</p>
<p>Ayrıca eğer bir taban sınıfı alt sınıflara olduğu gibi aktaracaksanız, taban
sınıftan gelen metot ve nitelikler üzerinde herhangi bir değişiklik
yapmayacaksanız ve alt sınıflara da herhangi bir nitelik ilave etmeyecekseniz,
alt sınıflar tanımlamak yerine doğrudan taban sınıfın örneklerinden yararlanmak
daha akıllıca ve pratik bir tercih olabilir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">asker</span> <span class="o">=</span> <span class="n">Oyuncu</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">,</span> <span class="s1">'Er'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">işçi</span> <span class="o">=</span> <span class="n">Oyuncu</span><span class="p">(</span><span class="s1">'Mehmet'</span><span class="p">,</span> <span class="s1">'Usta'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">yönetici</span> <span class="o">=</span> <span class="n">Oyuncu</span><span class="p">(</span><span class="s1">'Selim'</span><span class="p">,</span> <span class="s1">'Müdür'</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada asker, işçi ve yönetici için ayrı ayrı alt sınıflar tanımlamak yerine,
her biri için doğrudan <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> sınıfını farklı <cite>isim</cite> ve <cite>rütbe</cite>
değerleriyle örnekleyerek istediğimiz şeyi elde ettik.</p>
<p>İlerleyen derslerde miras alma alternatiflerinden daha ayrıntılı bir şekilde söz
edeceğiz, ama dilerseniz şimdi konuyu daha fazla dağıtmadan miras alınan metot
ve niteliklerin alt sınıflar içinde nasıl yeniden tanımlanacağını, nasıl
değişikliğe uğratılacağını ve alt sınıflara nasıl yeni nitelik ve metotlar
ekleneceğini incelemeye geçelim ve ilk örneklerimizi vermeye başlayalım.</p>
<p>Hatırlarsanız bir önceki başlıkta şöyle bir kod yazmıştık:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> sınıfını bütünüyle alt sınıfa aktardık. Peki ya biz bir
taban sınıfı olduğu gibi miras almak yerine, bazı nitelikleri üzerinde
değişiklik yaparak miras almak istersek ne olacak? Mesela taban sınıf içinde
<cite>self.güç</cite> değeri 0. Biz bu değerin <code class="docutils literal notranslate"><span class="pre">Asker()</span></code>, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code>
örnekleri için birbirinden farklı olmasını isteyebiliriz. Veya taban sınıfı
olduğu gibi miras almakla birlikte, alt sınıflardan herhangi birine ilave
nitelik veya nitelikler eklemek de isteyebiliriz. Diyelim ki biz <code class="docutils literal notranslate"><span class="pre">Asker()</span></code>
sınıfı için, öteki sınıflardan farklı olarak, bir de <cite>memleket</cite> niteliği
tanımlamak istiyoruz. Peki bu durumda ne yapacağız?</p>
<p>İşte bunun için <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfını şu şekilde yazabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="n">memleket</span> <span class="o">=</span> <span class="s1">'Arpaçbahşiş'</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfına <cite>memleket</cite> adlı bir sınıf niteliği eklemiş olduk.
Dolayısıyla <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfı, <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı taban sınıftan miras alınan
bütün nitelik ve metotlarla birlikte bir de <cite>memleket</cite> niteliğine sahip olmuş
oldu:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">asker</span> <span class="o">=</span> <span class="n">Asker</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">,</span> <span class="s1">'binbaşı'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">isim</span>
<span class="go">'Ahmet'</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">memleket</span>
<span class="go">'Arpaçbahşiş'</span>
</pre></div>
</div>
<p>Elbette, bu niteliği öbür alt sınıflarda tanımlamadığımız için bu nitelik
yalnızca <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfına özgüdür.</p>
<p>Aynı şekilde, bir taban sınıftan türeyen bir alt sınıfa yeni bir sınıf metodu,
örnek metodu veya statik metot da ekleyebiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="n">memleket</span> <span class="o">=</span> <span class="s1">'Arpaçbahşiş'</span>
<span class="k">def</span> <span class="nf">örnek_metodu</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">sınıf_metodu</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">pass</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">statik_metot</span><span class="p">():</span>
<span class="k">pass</span>
</pre></div>
</div>
<p><strong>Kural şu</strong>: Eğer alt sınıfa eklenen herhangi bir nitelik veya metot taban
sınıfta zaten varsa, alt sınıfa eklenen nitelik ve metotlar taban sınıftaki
metot ve niteliklerin yerine geçecektir. Yani diyelim ki taban sınıfımız şu:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu sınıfın nitelik ve metotlarını miras yoluyla devralan <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfımız
ise şu:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Şimdi bu sınıf içinde <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> adlı bir örnek metodu tanımlayalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'yeni hareket_et() metodu'</span><span class="p">)</span>
</pre></div>
</div>
<p>Eğer taban sınıfta <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> adlı bir metot olmasaydı, <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> adlı
alt sınıf, taban sınıftan miras alınan öteki metot ve niteliklerle birlikte bir
de <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> adlı yeni bir örnek metoduna sahip olmuş olacaktı. Ancak
taban sınıfta zaten <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> adlı bir örnek metodu olduğu için, alt
sınıfta tanımladığımız aynı adlı örnek metodu, taban sınıftaki metodun yerine
geçip üzerine yazıyor.</p>
<p>Buraya kadar her şey tamam. Artık bir taban sınıfa ait metodu alt sınıfa miras
yoluyla aktarırken nasıl yeniden tanımlayacağımızı öğrendik. Ayrıca alt
sınıflara nasıl yeni metot ve nitelik ekleyeceğimizi de biliyoruz. Ama mesela,
<cite>self.isim</cite> ve <cite>self.rütbe</cite> değişkenlerini korurken, taban sınıf içinde 0 değeri
ile gösterilen <cite>self.güç</cite> değişkenini <code class="docutils literal notranslate"><span class="pre">Asker()</span></code>, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code>
sınıflarının her biri içinde nasıl farklı bir değerle göstereceğimizi
bilmiyoruz. Yani <cite>self.güç</cite> değerini <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfı içinde 100, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code>
sınıfı içinde 70, <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> sınıfı içinde ise 50 ile göstermek istesek
nasıl bir yol takip etmemiz gerektiği konusunda bir fikrimiz yok. İsterseniz şu
ana kadar bildiğimiz yöntemleri kullanarak bu amacımızı gerçekleştirmeyi bir
deneyelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">70</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">50</span>
</pre></div>
</div>
<p>Burada taban sınıfın <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodunu alt sınıflarda yeniden tanımladık.
Bu kodları bu şekilde yazıp çalıştırdığımızda <cite>self.güç</cite> değerinin her bir alt
sınıf için istediğimiz değere sahip olduğunu görürüz. Ancak burada şöyle bir
sorun var. Bu kodları bu şekilde yazarak <cite>self.isim</cite> ve <cite>self.rütbe</cite>
değişkenlerinin değerini maalesef kaybettik…</p>
<p><code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodunun parametre listesine <cite>isim</cite> ve <cite>rütbe</cite> parametrelerini
yazdığımız halde bunları kodlarımız içinde herhangi bir şekilde kullanmadığımız
için, bu parametrelerin listede görünüyor olması bir şey ifade etmiyor. Yani alt
sınıflarda tanımladığımız <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu bizden <cite>isim</cite> ve <cite>rütbe</cite> adlı
iki parametre bekliyor olsa da, bu parametrelerin değerini kodlar içinde
kullanmadığımız için bu parametrelere değer atamamız herhangi bir amaca hizmet
etmiyor.</p>
<p>Gelin bu söylediklerimizi kanıtlayalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">oyuncular</span>
<span class="gp">>>> </span><span class="n">asker</span> <span class="o">=</span> <span class="n">oyuncular</span><span class="o">.</span><span class="n">Asker</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">,</span> <span class="s1">'Er'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">rütbe</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
<span class="gr">AttributeError</span>: <span class="n">'Asker' object has no attribute 'rütbe'</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">isim</span>
<span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
<span class="gr">AttributeError</span>: <span class="n">'Asker' object has no attribute 'isim'</span>
</pre></div>
</div>
<p>Bu sorunu çözmek için alt sınıflarımızı şu şekilde yazabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">70</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">50</span>
</pre></div>
</div>
<p>Burada <cite>self.isim</cite> ve <cite>self.rütbe</cite> değişkenlerini her bir alt sınıf için tekrar
tanımladık. Bu küçük örnekte pek sorun olmayabilir, ama taban sınıfın
<code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodunun içinde çok daha karmaşık işlemlerin yapıldığı
durumlarda yukarıdaki yaklaşım hiç de pratik olmayacaktır. Ayrıca eğer miras
alma işlemini, içeriğini bilmediğiniz veya başka bir dosyada bulunan bir
sınıftan yapıyorsanız yukarıdaki yöntem tamamen kullanışsız olacaktır. Ayrıca
aynı şeyleri tekrar tekrar yazmak miras alma mekanizmasının ruhuna tamamen
aykırıdır. Çünkü biz miras alma işlemini zaten aynı şeyleri tekrar tekrar
yazmaktan kurtulmak için yapıyoruz.</p>
<p>Bu arada, yukarıda yapmak istediğimiz şeyi şununla karıştırmayın: Biz elbette
taban sınıftaki bir niteliği, örnekleme sırasında değiştirme imkanına her
koşulda sahibiz. Yani taban ve alt sınıfların şöyle tanımlanmış olduğunu
varsayarsak:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Her bir alt sınıfın <cite>güç</cite> değişkenini şu şekilde değiştirebiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">oyuncular</span>
<span class="gp">>>> </span><span class="n">asker</span> <span class="o">=</span> <span class="n">oyuncular</span><span class="o">.</span><span class="n">Asker</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">,</span> <span class="s1">'Er'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">güç</span>
<span class="go">0</span>
</pre></div>
</div>
<p>Gördüğünüz gibi şu anda askerin gücü 0. Bunu 100 yapalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">güç</span>
<span class="go">100</span>
</pre></div>
</div>
<p>Aynı şeyi öteki <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> sınıflarının örnekleri üzerinde de
yapabiliriz. Ama bizim istediğimiz bu değil. Biz, <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfını
örneklediğimiz anda gücü 100, <code class="docutils literal notranslate"><span class="pre">İşçi()</span></code> sınıfını örneklediğimiz anda gücü 70,
<code class="docutils literal notranslate"><span class="pre">Yönetici()</span></code> sınıfını örneklediğimiz anda ise gücü 50 olsun istiyoruz.</p>
<p>İşte tam bu noktada imdadımıza yepyeni bir fonksiyon yetişecek. Bu yeni
fonksiyonun adı <code class="docutils literal notranslate"><span class="pre">super()</span></code>.</p>
</section>
<section id="super">
<h2>super()<a class="headerlink" href="#super" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Hatırlarsanız, taban sınıflardan ilk kez bahsederken, bunlara üst sınıf da
dendiğini söylemiştik. Üst sınıf kavramının İngilizcesi <em>super class</em>’tır. İşte
bu bölümde inceleyeceğimiz <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonunun adı da buradaki ‘super’,
yani ‘üst’ kelimesinden gelir. Miras alınan üst sınıfa atıfta bulunan
<code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonu, miras aldığımız bir <strong>üst</strong> sınıfın nitelik ve metotları
üzerinde değişiklik yaparken, mevcut özellikleri de muhafaza edebilmemizi
sağlar.</p>
<p>Bir önceki başlıkta verdiğimiz örnek üzerinden <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonunu
açıklamaya çalışalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
</pre></div>
</div>
<p>Bu kodlarda, <code class="docutils literal notranslate"><span class="pre">Oyuncu()</span></code> adlı taban sınıfı miras alan <code class="docutils literal notranslate"><span class="pre">Asker()</span></code> sınıfı,
<code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu içinde <cite>self.güç</cite> değerini yeniden tanımlıyor. Ancak bu
şekilde taban sınıfın <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu silindiği için, <cite>self.isim</cite> ve
<cite>self.rütbe</cite> değişkenlerini kaybediyoruz. İşte bu sorunu, üst sınıfa atıfta
bulunan <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonu ile çözebiliriz.</p>
<p>Dikkatlice bakın:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</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">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu içinde şöyle bir satır kullandığımızı
görüyorsunuz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></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">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">)</span>
</pre></div>
</div>
<p>İşte bu satırda <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonu, tam da adının anlamına uygun olarak,
miras alınan üst sınıfın <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu içindeki kodların, miras alan alt
sınıfın <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu içine aktarılmasını sağlıyor. Böylece hem taban
sınıfın <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu içindeki <cite>self.isim</cite> ve <cite>self.rütbe</cite> niteliklerini
korumuş, hem de <cite>self.güç</cite> adlı yeni bir nitelik ekleme imkanı elde etmiş
oluyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">asker</span> <span class="o">=</span> <span class="n">oyuncular</span><span class="o">.</span><span class="n">Asker</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">,</span> <span class="s1">'Er'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">isim</span>
<span class="go">'Ahmet'</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">rütbe</span>
<span class="go">'Er'</span>
<span class="gp">>>> </span><span class="n">asker</span><span class="o">.</span><span class="n">güç</span>
<span class="go">100</span>
</pre></div>
</div>
<p>Bu bilgiyi öteki alt sınıflara da uygulayalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</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">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</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">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">70</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</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">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">20</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonu sayesinde taban sınıfın değiştirmek
istediğimiz niteliklerine yeni değerler atarken, değiştirmek istemediğimiz
nitelikleri ise aynı şekilde muhafaza ettik.</p>
<p>Bu arada eğer taban sınıfın <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodundaki parametre listesini alt
sınıfta da tek tek tekrar etmek sizi rahatsız ediyorsa yukarıdaki kodları şöyle
de yazabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">arglar</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="o">*</span><span class="n">arglar</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">class</span> <span class="nc">İşçi</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">arglar</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="o">*</span><span class="n">arglar</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">70</span>
<span class="k">class</span> <span class="nc">Yönetici</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">arglar</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="o">*</span><span class="n">arglar</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">20</span>
</pre></div>
</div>
<p>Yıldızlı parametreleri önceki derslerimizden hatırlıyor olmalısınız. Bildiğiniz
gibi, tek yıldızlı parametreler bir fonksiyonun bütün konumlu (<em>positional</em>)
argümanlarını, parametrelerin parantez içinde geçtiği sırayı dikkate alarak bir
demet içinde toplar. İşte yukarıda da bu özellikten faydalanıyoruz. Eğer taban
sınıfta isimli (<em>keyword</em>) argümanlar da olsaydı, o zaman da çift yıldızlı
argümanları kullanabilirdik.</p>
<p>Tek ve çift yıldızlı argümanlar genellikle şu şekilde gösterilir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
</pre></div>
</div>
<p>Böylece konumlu argümanları bir demet içinde, isimli argümanları ise bir sözlük
içinde toplamış oluyoruz. Bu da bizi üst (ya da taban) sınıfın parametre
listesini alt sınıflarda tekrar etme derdinden kurtarıyor.</p>
<p>Bu arada, miras alınan taban sınıfa atıfta bulunan <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonu,
Python programlama diline sonradan eklenmiş bir özelliktir. Bu fonksiyon
gelmeden önce taban sınıfa atıfta bulunabilmek için doğrudan o sınıfın adını
kullanıyorduk:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="n">Oyuncu</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">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
</pre></div>
</div>
<p>veya:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="n">Oyuncu</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="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, eski yöntemde taban sınıfın adını iki kez kullanmamız
gerekiyor. Ayrıca <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> fonksiyonunun parametre listesinde ilk sıraya
yine <cite>self</cite> kelimesini de eklemek zorunda kalıyoruz.</p>
<p>İsterseniz yukarıda gösterdiğimiz eski yöntemi kullanmaya devam edebilirsiniz
elbette. Ancak <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonunu kullanmak eski yönteme göre biraz daha
pratiktir.</p>
<p>Yukarıdaki örneklerde <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonunu <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu içinde
kullandık. Ancak elbette <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonunu yalnızca <code class="docutils literal notranslate"><span class="pre">__init__()</span></code>
fonksiyonu içinde kullanmak zorunda değiliz. Bu fonksiyonu başka fonksiyonlar
içinde de kullanabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Oyuncu</span><span class="p">():</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="n">isim</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rütbe</span> <span class="o">=</span> <span class="n">rütbe</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hareket ediliyor...'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kazan</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kazanıldı'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">puan_kaybet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'puan kaybedildi'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Asker</span><span class="p">(</span><span class="n">Oyuncu</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">isim</span><span class="p">,</span> <span class="n">rütbe</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">isim</span><span class="p">,</span> <span class="n">rütbe</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">güç</span> <span class="o">=</span> <span class="mi">100</span>
<span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">hareket_et</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hedefe ulaşıldı.'</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu örneğin, <code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonunun nasıl işlediğini daha iyi anlamanızı
sağladığını zannediyorum. Gördüğünüz gibi, taban sınıfın <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> adlı
metodunu alt sınıfta tanımladığımız aynı adlı fonksiyon içinde <code class="docutils literal notranslate"><span class="pre">super()</span></code>
fonksiyonu yardımıyla genişlettik, yani taban sınıfın <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> adlı
fonksiyonuna yeni bir işlev ekledik:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">hareket_et</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">hareket_et</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'hedefe ulaşıldı.'</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">super().hareket_et()</span></code> satırıyla taban sınıfın <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> adlı
metodunu alt sınıfta tanımladığımız yeni <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> metodu içinde
çalıştırarak, bu metodun kabiliyetlerini yeni <code class="docutils literal notranslate"><span class="pre">hareket_et()</span></code> metoduna
aktarıyoruz.</p>
</section>
<section id="object-sinifi">
<h2>object Sınıfı<a class="headerlink" href="#object-sinifi" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Biz buraya gelinceye kadar Python’da sınıfları iki farklı şekilde
tanımlayabileceğimizi öğrendik:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Deneme</span><span class="p">():</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>veya:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Deneme</span><span class="p">:</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Sınıf tanımlarken parantez kullansak da olur kullanmasak da. Eğer miras
alacağınız bir sınıf yoksa parantezsiz yazımı tercih edebilir, parantezli yazım
tarzını ise başka bir sınıftan miras aldığınız durumlar için saklayabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">AltSınıf</span><span class="p">(</span><span class="n">TabanSınıf</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Ancak sağda solda incelediğiniz Python kodlarında bazen şöyle bir sınıf
tanımlama şekli de görürseniz şaşırmayın:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Sınıf</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Python’ın 3.x öncesi sürümlerinde sınıflar yeni ve eski tip olmak üzere ikiye
ayrılıyordu. Bu sürümlerde eski tip sınıflar şöyle tanımlanıyordu:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Sınıf</span><span class="p">:</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>veya:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Sınıf</span><span class="p">():</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Yeni tip sınıflar ise şöyle:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Sınıf</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>