forked from yazbel/python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnesne_tabanli_programlama4.html
More file actions
1309 lines (1166 loc) · 108 KB
/
nesne_tabanli_programlama4.html
File metadata and controls
1309 lines (1166 loc) · 108 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="tr">
<html lang="tr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><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" href="_static/pyramid.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="./" 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/language_data.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_programlama5.html" />
<link rel="prev" title="Nesne Tabanlı Programlama (Devamı)" href="nesne_tabanli_programlama3.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'>yazbel.com</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_programlama5.html" title="Nesne Tabanlı Programlama (Devamı)"
accesskey="N">sonraki</a></li>
<li class="right" >
<a href="nesne_tabanli_programlama3.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">
<div class="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>Geçen bölümlerde, nesne tabanlı programlamaya ilişkin hem temel, hem orta, hem
de ileri düzey sayılabilecek pek çok konuya değindik. Şimdiye kadar
öğrendiklerimiz, nesne tabanlı programlama yaklaşımı çerçevesinde yazılım
üretirken yönümüzü bulabilmemiz açısından büyük ölçüde yeterlidir. Ancak daha
önce de söylediğimiz gibi, nesne tabanlı programlama çok geniş kapsamlı bir
konudur ve içinde şimdiye kadar adını bile anmadığımız daha pek çok kavram
barındırır. İşte bu bölümde, geçen derslerimizde incelemeye fırsat
bulamadığımız, ancak nesne tabanlı programlamayı daha derinlemesine tanımak
bakımından bilmemizin iyi olacağı birtakım ileri düzey kavramlardan söz
edeceğiz.</p>
<p>Bu bölümde inceleyeceğimiz ilk konu ‘sınıf üyeleri’.</p>
<div class="section" id="sinif-uyeleri">
<h2>Sınıf Üyeleri<a class="headerlink" href="#sinif-uyeleri" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Python’da bir sınıf içinde bulunan nitelikler, değişkenler, metotlar,
fonksiyonlar ve buna benzer başka veri tipleri, o sınıfın üyelerini meydana
getirir. Bir sınıfın üyelerini genel olarak üçe ayırarak inceleyebiliriz:</p>
<ul class="simple">
<li><p>Aleni üyeler (<em>public members</em>)</p></li>
<li><p>Gizli üyeler (<em>private members</em>)</p></li>
<li><p>Yarı-gizli üyeler (<em>semi-private members</em>).</p></li>
</ul>
<p>Bu bölümde bu üç üye türünü ve bunların birbirinden farkını ele alacağız.
Öncelikle aleni üyelerden başlayalım.</p>
<div class="section" id="aleni-uyeler">
<h3>Aleni Üyeler<a class="headerlink" href="#aleni-uyeler" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Eğer bir sınıf üyesi dışarıya açıksa, yani bu üyeye sınıf dışından <em>normal
yöntemlerle</em> erişilebiliyorsa bu tür üyelere ‘aleni üyeler’ adı verilir.
Programlama maceranız boyunca karşınıza çıkacak veri üyelerinin tamamına yakını
alenidir. Biz de bu kitapta şimdiye kadar yalnızca aleni üyeleri gördük.</p>
<p>Eğer bildiğiniz tek programlama dili Python ise, şu anda tam olarak neden
bahsediyor olduğumuza anlam verememiş olabilirsiniz. Dilerseniz durumu
zihninizde biraz olsun netleştirebilmek için basit bir örnek verelim.</p>
<p>Diyelim ki elimizde şöyle bir sınıf var:</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="n">sınıf_niteliği</span> <span class="o">=</span> <span class="s1">'sınıf niteliğ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="nb">print</span><span class="p">(</span><span class="s1">'örnek metodu'</span><span class="p">)</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="nb">print</span><span class="p">(</span><span class="s1">'sınıf metodu'</span><span class="p">)</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">statik_metot</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'statik metot'</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu kodların <cite>sinif.py</cite> adlı bir dosya içinde yer aldığını varsayarsak şöyle bir
şeyler yazabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">sinif</span>
<span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="n">sinif</span><span class="o">.</span><span class="n">Sınıf</span><span class="p">()</span>
<span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="n">s</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__',</span>
<span class="go"> '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',</span>
<span class="go"> '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',</span>
<span class="go"> 'statik_metot', 'sınıf_metodu', 'sınıf_niteliği', 'örnek_metodu']</span>
</pre></div>
</div>
<p>Burada öncelikle kodlarımızı barındıran modülü içe aktardık. Daha sonra, içe
aktardığımız modülün içindeki <code class="docutils literal notranslate"><span class="pre">Sınıf()</span></code> adlı sınıfımızı <cite>s</cite> örneğine atadık ve
ardından <code class="docutils literal notranslate"><span class="pre">dir()</span></code> komutunu kullanarak, içe aktardığımız bu sınıfın içeriğini
sorguladık.</p>
<p>Gördüğünüz gibi, içe aktardığımız sınıfın bütün öğeleri listede var. Yani biz bu
sınıf içindeki bütün öğelere normal yollardan erişme imkanına sahibiz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">s</span><span class="o">.</span><span class="n">statik_metot</span><span class="p">()</span>
<span class="go">'statik metot'</span>
<span class="gp">>>> </span><span class="n">s</span><span class="o">.</span><span class="n">örnek_metodu</span><span class="p">()</span>
<span class="go">'örnek metodu'</span>
<span class="gp">>>> </span><span class="n">s</span><span class="o">.</span><span class="n">sınıf_metodu</span><span class="p">()</span>
<span class="go">'sınıf metodu'</span>
<span class="gp">>>> </span><span class="n">s</span><span class="o">.</span><span class="n">sınıf_niteliği</span>
<span class="go">'sınıf niteliği'</span>
</pre></div>
</div>
<p>İşte <code class="docutils literal notranslate"><span class="pre">dir()</span></code> komutunun çıktısında görünen ve normal yollardan erişebildiğimiz
bütün bu öğeler birer aleni üyedir.</p>
<p>Yukarıda da ifade ettiğimiz gibi, program yazarken çoğu zaman yalnızca aleni
üyelerle muhatap olacaksınız. Ancak bazı durumlarda, yazdığınız bir sınıftaki
bütün sınıf üyelerinin dışarıya açık olmasını istemeyebilirsiniz. Eğer
kodlarınızda, sınıfın yalnızca iç işleyişini ilgilendiren, bu yüzden de
dışarıdan erişilmesine gerek olmadığını veya erişilirse problem çıkacağını
düşündüğünüz birtakım öğeler varsa bunları dışarıya kapatarak bir ‘gizli üye’
haline getirmek isteyebilirsiniz. Peki ama nasıl?</p>
</div>
<div class="section" id="gizli-uyeler">
<h3>Gizli Üyeler<a class="headerlink" href="#gizli-uyeler" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Python’da şimdiye kadar gördüğümüz ve yukarıda andığımız aleni üyelerin dışında,
bir de gizli üyeler bulunur. Aleni üyelerin aksine gizli üyeler dışarıya açık
değildir. Gizli üyelere, normal yöntemleri kullanarak sınıf dışından erişemeyiz.</p>
<p>Konuyu açıklığa kavuşturmak için, aleni üyeleri anlatırken verdiğimiz sınıf
örneğinde şu değişikliği yapalım:</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="n">__gizli</span> <span class="o">=</span> <span class="s1">'gizli'</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="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gizli</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'örnek metodu'</span><span class="p">)</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="nb">print</span><span class="p">(</span><span class="s1">'sınıf metodu'</span><span class="p">)</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">statik_metot</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'statik metot'</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada <cite>__gizli</cite> adlı bir gizli sınıf niteliği tanımladık. Bu değişkenin
yalnızca baş tarafında iki adet alt çizgi olduğuna, ancak uç tarafında alt
çizgi bulunmadığına dikkat edin. İşte Python’da baş tarafında yukarıdaki gibi
iki adet alt çizgi olan, ancak uç tarafında alt çizgi bulunmayan (veya yalnızca
tek bir alt çizgi bulunan) bütün öğeler birer gizli üyedir. Dışarıya kapalı olan
bu gizli üyelere, normal yöntemleri kullanarak sınıf dışından erişemezsiniz.</p>
<p>İsterseniz deneyelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">sinif</span>
<span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="n">sinif</span><span class="o">.</span><span class="n">Sınıf</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">s</span><span class="o">.</span><span class="n">__gizli</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">'Sınıf' object has no attribute '__gizli'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, örnek adı üzerinden <cite>__gizli</cite> niteliğine erişemiyoruz. Bir de
sınıf adı üzerinden erişmeyi deneyelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">sinif</span><span class="o">.</span><span class="n">Sınıf</span><span class="o">.</span><span class="n">__gizli</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">type object 'Sınıf' has no attribute '__gizli'</span>
</pre></div>
</div>
<p>Bu şekilde de erişemedik. Çünkü dediğimiz gibi, başında çift alt çizgi olan,
ancak ucunda herhangi bir çizgi bulunmayan (veya tek bir alt çizgi bulunan) bu
gizli öğelere <strong>normal yollardan</strong> erişemeyiz.</p>
<p>Dilerseniz gizli üye oluşturma kurallarını şöyle bir netleştirelim:</p>
<p>Bir üyenin gizli olabilmesi için başında <strong>en az</strong> iki adet, ucunda da <strong>en
fazla</strong> bir adet alt çizgi bulunmalıdır. Yani şunlar birer gizli üyedir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">__gizli</span> <span class="o">=</span> <span class="s1">'gizli'</span>
<span class="gp">>>> </span><span class="n">__gizli_</span> <span class="o">=</span> <span class="s1">'gizli'</span>
<span class="gp">>>> </span><span class="n">__gizli_üye</span> <span class="o">=</span> <span class="s1">'gizli'</span>
<span class="gp">>>> </span><span class="n">__gizli_üye_</span> <span class="o">=</span> <span class="s1">'gizli'</span>
</pre></div>
</div>
<p>Burada önemli bir noktaya dikkatinizi çekmek istiyorum: Gizli üyeler yalnızca
<strong>sınıf dışına</strong> kapalıdır. Bu üyelere <strong>sınıf içinden</strong> rahatlıkla
erişebiliriz. Mesela yukarıdaki örnekte bu durumu görüyorsunuz. <cite>__gizli</cite> adlı
değişkene <code class="docutils literal notranslate"><span class="pre">örnek_metodu()</span></code> içinden normal bir şekilde erişebiliyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></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="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gizli</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'örnek metodu'</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu durumda sınıf dışından bu <code class="docutils literal notranslate"><span class="pre">örnek_metodu()</span></code>’na eriştiğimizde gizli üye olan
<cite>__gizli</cite>’ye de erişmiş oluyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">sinif</span>
<span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="n">sinif</span><span class="o">.</span><span class="n">Sınıf</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">s</span><span class="o">.</span><span class="n">örnek_metodu</span><span class="p">()</span>
<span class="go">'gizli'</span>
<span class="go">'örnek metodu'</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">örnek_metodu()</span></code>, <cite>__gizli</cite> adlı gizli üyeye erişmemiz için bize
aracılık etmiş oluyor.</p>
<p>Peki ama bir insan neden bu şekilde birtakım gizli üyeler tanımlamak istiyor
olabilir?</p>
<p>Hatırlarsanız geçen bölümde şöyle bir örnek vermiştik:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Çalışan</span><span class="p">():</span>
<span class="n">personel</span> <span class="o">=</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="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">kabiliyetleri</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">personele_ekle</span><span class="p">()</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personel_sayısını_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">personel</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">kabiliyet_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">kabiliyet</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kabiliyetleri</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">kabiliyet</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">kabiliyetleri_görüntüle</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">'</span><span class="si">{}</span><span class="s1"> adlı kişinin kabiliyetleri:'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="k">for</span> <span class="n">kabiliyet</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">kabiliyetleri</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kabiliyet</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada <cite>personel</cite> adlı bir sınıf niteliğimiz var. Bu niteliğe sınıf içinde hem
<code class="docutils literal notranslate"><span class="pre">personele_ekle()</span></code> adlı örnek metodundan hem de
<code class="docutils literal notranslate"><span class="pre">personel_sayısını_görüntüle()</span></code> ve <code class="docutils literal notranslate"><span class="pre">personeli_görüntüle()</span></code> adlı sınıf
metotlarından erişmek suretiyle bu nitelik üzerinde çeşitli işlemler yapıyoruz.</p>
<p>Esasında şöyle bir düşününce, <cite>personel</cite> adlı niteliğin yalnızca sınıfın iç
işleyişi açısından önem taşıdığını rahatlıkla söyleyebiliriz. Bu niteliğe sınıf
dışından doğrudan erişilerek personel üzerinde işlem yapılmaya çalışılması çok
mantıksız. Yani sınıfımızı kullanacak kişilerin şu tür bir kod yazması biraz
abes kaçacaktır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">calisan</span> <span class="kn">import</span> <span class="n">Çalışan</span>
<span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">)</span>
</pre></div>
</div>
<p>Zira biz, kodlarımızın yapısı gereği, personel üzerindeki işlemlerin yalnızca
çeşitli fonksiyonlar/metotlar aracılığıyla yapılmasını istiyoruz.</p>
<p>Personele eleman ekleyecek kişilerin doğrudan <cite>personel</cite> listesine erişmesi,
kodlarımızın kullanım kurallarının bir bakıma ihlal edilmesi anlamına geliyor.
Çünkü biz personele eleman ekleme işlemleri için halihazırda ayrı bir metot
tanımlamış durumdayız. Eğer personele adam eklenecekse, bu işlem doğrudan
<cite>personel</cite> listesi üzerinden değil, <code class="docutils literal notranslate"><span class="pre">personele_ekle()</span></code> adlı örnek metodu
üzerinden gerçekleştirilmeli. Yukarıdaki kodlarda bu <code class="docutils literal notranslate"><span class="pre">personele_ekle()</span></code> metodu
doğrudan sınıfın kendi <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu tarafından kullanılıyor.
Dolayısıyla yukarıdaki sınıfı kullanmanın doğru yolu, ilgili sınıfı
örneklemektir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">calisan</span> <span class="kn">import</span> <span class="n">Çalışan</span>
<span class="gp">>>> </span><span class="n">ahmet</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">)</span>
</pre></div>
</div>
<p>Aynı şekilde personel listesini görüntülemek için de doğrudan <cite>personel</cite>
listesine erişmeye çalışmayacağız. Yani şöyle bir şey yazmayacağız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personel</span>
</pre></div>
</div>
<p>Bunun yerine, bu iş için özel olarak tasarladığımız <code class="docutils literal notranslate"><span class="pre">personeli_görüntüle()</span></code>
fonksiyonunu kullanacağız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personeli_görüntüle</span><span class="p">()</span>
</pre></div>
</div>
<p>İşte yukarıdaki kodlarda yer alan <cite>personel</cite> listesinin usulsüz bir şekilde
kullanılmasını önlemek amacıyla bu listeyi bir gizli üye haline
getirebilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Çalışan</span><span class="p">():</span>
<span class="n">__personel</span> <span class="o">=</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="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">kabiliyetleri</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">personele_ekle</span><span class="p">()</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personel_sayısını_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">__personel</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</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">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">kabiliyet_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">kabiliyet</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kabiliyetleri</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">kabiliyet</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">kabiliyetleri_görüntüle</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">'</span><span class="si">{}</span><span class="s1"> adlı kişinin kabiliyetleri:'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="k">for</span> <span class="n">kabiliyet</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">kabiliyetleri</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kabiliyet</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada <cite>personel</cite> listesinin baş tarafına iki alt çizgi ekleyerek bunu sınıf
dışından, normal yollarla erişilmez hale getirdik:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">__personel</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">type object 'Çalışan' has no attribute '__personel'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, aslında sınıfımız içinde <cite>__personel</cite> adlı bir nitelik olmasına
rağmen, Python bu niteliğe sınıf dışından erişilmesine izin vermiyor. Eğer
amacımız personel üzerinde çeşitli işlemler yapmaksa, bu iş için sınıfın bize
sunduğu metotları kullanmamız gerekiyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personel_sayısını_görüntüle</span><span class="p">()</span>
</pre></div>
</div>
<p>Bu tip durumlarda gizli üyeler epey işinize yarayabilir…</p>
<p>Bir örnek daha verelim.</p>
<p>Yukarıdaki kodlarda, tıpkı <cite>personel</cite> listesi gibi, aslında <code class="docutils literal notranslate"><span class="pre">personele_ekle()</span></code>
fonksiyonu da dışarıdan erişilmesine gerek olmayan, hatta dışarıdan erişilirse
kafa karıştırıcı olabilecek bir sınıf üyesidir.</p>
<p><code class="docutils literal notranslate"><span class="pre">personele_ekle()</span></code> adlı örnek metodu, sınıfımız içinde <code class="docutils literal notranslate"><span class="pre">__init__()</span></code>
fonksiyonu tarafından kullanılıyor. Dolayısıyla sınıfımız örneklendiğinde
<code class="docutils literal notranslate"><span class="pre">personele_ekle()</span></code> metodu devreye girerek yeni elemanı personel listesine
ekliyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ayşe</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="p">(</span><span class="s1">'Ayşe'</span><span class="p">)</span>
<span class="go">'Ayşe adlı kişi personele eklendi'</span>
</pre></div>
</div>
<p>Öte yandan, bu fonksiyon aleni bir üye olduğu için, buna dışarıdan erişmemizin
önünde herhangi bir engel yok:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ayşe</span><span class="o">.</span><span class="n">personele_ekle</span><span class="p">()</span>
<span class="go">'Ayşe adlı kişi personele eklendi'</span>
</pre></div>
</div>
<p>Bu fonksiyon sınıf dışından çağrıldığında, kendisini çağıran örnek adını
personel listesine tekrar ekleyecektir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personeli_görüntüle</span><span class="p">()</span>
<span class="go">Ayşe</span>
<span class="go">Ayşe</span>
</pre></div>
</div>
<p>Yani yukarıdaki komut Ayşe adlı kişiyi personel listesine tekrar ekler.
Dolayısıyla bu fonksiyona sınıf dışından erişilmesi son derece mantıksız, son
derece yanlış ve hatta son derece kafa karıştırıcıdır. O yüzden, herhangi bir
sıkıntı yaşanmasını engellemek amacıyla bu fonksiyonu da bir gizli üye olarak
tanımlayabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Çalışan</span><span class="p">():</span>
<span class="n">__personel</span> <span class="o">=</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="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">kabiliyetleri</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__personele_ekle</span><span class="p">()</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personel_sayısını_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">__personel</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">__personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">kabiliyet_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">kabiliyet</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kabiliyetleri</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">kabiliyet</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">kabiliyetleri_görüntüle</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">'</span><span class="si">{}</span><span class="s1"> adlı kişinin kabiliyetleri:'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="k">for</span> <span class="n">kabiliyet</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">kabiliyetleri</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kabiliyet</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu şekilde <code class="docutils literal notranslate"><span class="pre">personele_ekle()</span></code> fonksiyonunu da dışarıya kapatmış olduk. Artık
bu fonksiyon da, olması gerektiği gibi, yalnızca sınıf içinde kullanılabilecek.</p>
<p>Yukarıdaki örnekler, bazı durumlarda veri gizlemenin epey işimize
yarayabileceğini bariz bir biçimde gösteriyor. Ama elbette, yukarıdaki
işlemlerin hiçbiri zorunlu değildir. Yani siz, yazdığınız kodlarda hiçbir sınıf
üyesini gizlemek mecburiyetinde değilsiniz. Yukarıda gösterdiğimiz kullanımlar
tamamen tercih meselesidir. Zaten birkaç nadir durum dışında, Python’da
verilerinizi gizlemek zorunda da kalmazsınız. Ama tabii kendiniz Python’ın bu
özelliğinden yararlanmasanız da, sırf bu özellikten yararlanan başka
programcıların yazdığı kodları anlayabilmek için bile olsa bu özellikten
haberdar olmalısınız.</p>
</div>
<div class="section" id="isim-bulandirma">
<h3>İsim Bulandırma<a class="headerlink" href="#isim-bulandirma" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Gelin isterseniz gizli üyelere ilişkin ilginç bir özellikten söz edelim.</p>
<p>Python’da ‘gizli’ olarak adlandırdığımız öğeler aslında o kadar da gizli
değildir… Çünkü Python’da gerçek anlamda gizli ve dışarıya tamamen kapalı
üyeler bulunmaz. Peki bu ne anlama geliyor?</p>
<p>Bu şu anlama geliyor: Her ne kadar yukarıdaki örneklerde üyeleri dışarıya
kapatmak için kullandığımız alt çizgi işaretleri ilgili değişkeni gizlese de,
bunu tamamen erişilmez hale getirmez. Dediğimiz gibi, Python’da gerçek anlamda
dışa kapalı sınıf üyeleri bulunmadığı için biz bu üyelere <strong>bir şekilde</strong> erişme
imkanına sahibiz. Peki ama nasıl?</p>
<p>Python, kodlar içinde gizli bir üye ile karşılaştığında özel bir ‘isim
bulandırma’ (<em>name mangling</em>) işlemi gerçekleştirir ve ilgili gizli üyenin
görünüşünü değiştirir. Eğer Python’ın arkaplanda neler çevirdiğini bilirseniz,
gizli üyeye de erişebilirsiniz.</p>
<p>Örnek sınıfımız şöyleydi:</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="n">__gizli</span> <span class="o">=</span> <span class="s1">'gizli'</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="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__gizli</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'örnek metodu'</span><span class="p">)</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="nb">print</span><span class="p">(</span><span class="s1">'sınıf metodu'</span><span class="p">)</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">statik_metot</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'statik metot'</span><span class="p">)</span>
</pre></div>
</div>
<p>Şimdi, bu sınıf içindeki gizli üyeye erişeceğiz.</p>
<p>Dikkatlice bakın:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">sinif</span>
<span class="gp">>>> </span><span class="n">s</span> <span class="o">=</span> <span class="n">sinif</span><span class="o">.</span><span class="n">Sınıf</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">s</span><span class="o">.</span><span class="n">_Sınıf__gizli</span>
<span class="go">'gizli'</span>
</pre></div>
</div>
<p>Ne kadar da tuhaf, değil mi?</p>
<p>İşte Python, siz bir sınıf üyesini <cite>__gizli</cite> şeklinde tanımladığınızda, bu
öğe üzerinde şu işlemleri gerçekleştirir:</p>
<p>Öncelikle değişkenin baş tarafına bir alt çizgi ekler:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">_</span>
</pre></div>
</div>
<p>Daha sonra, bu alt çizginin sağ tarafına bu gizli üyeyi barındıran sınıfın adını
iliştirir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">_Sınıf</span>
</pre></div>
</div>
<p>Son olarak da gizli üyeyi sınıf adının sağ tarafına yapıştırır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">_Sınıf__gizli</span>
</pre></div>
</div>
<p>Dolayısıyla <code class="docutils literal notranslate"><span class="pre">_Sınıf__gizli</span></code> kodunu kullanarak, <cite>__gizli</cite> adlı üyeye sınıf
dışından erişebilirsiniz.</p>
<p>Pratik olması bakımından bir örnek daha verelim. Mesela şu örneği ele alalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Çalışan</span><span class="p">():</span>
<span class="n">__personel</span> <span class="o">=</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="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">kabiliyetleri</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__personele_ekle</span><span class="p">()</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personel_sayısını_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">__personel</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">__personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">kabiliyet_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">kabiliyet</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kabiliyetleri</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">kabiliyet</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">kabiliyetleri_görüntüle</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">'</span><span class="si">{}</span><span class="s1"> adlı kişinin kabiliyetleri:'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="k">for</span> <span class="n">kabiliyet</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">kabiliyetleri</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kabiliyet</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">__personele_ekle()</span></code> adlı fonksiyon bir gizli üyedir. Dolayısıyla buna
dışarıdan normal yöntemlerle erişemeyiz.</p>
<p>Bunu test etmek için önce gerekli verileri oluşturalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">calisan</span> <span class="kn">import</span> <span class="n">Çalışan</span>
<span class="gp">>>> </span><span class="n">ahmet</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">)</span>
<span class="go">Ahmet adlı kişi personele eklendi.</span>
</pre></div>
</div>
<p>Şimdi <cite>ahmet</cite> örneği üzerinden bu gizli üyeye erişmeye çalışalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ahmet</span><span class="o">.</span><span class="n">__personele_ekle</span><span class="p">()</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">'Çalışan' object has no attribute '__personele_ekle'</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, Python bu üyeye normal yollardan erişmemize izin vermiyor. Ama
biz biliyoruz ki, Python bu üyeyi gizlerken özel bir isim bulandırma işlemi
gerçekleştiriyor. Bu bulandırma işleminin nasıl gerçekleştirildiğini bildiğimize
göre gizli üyeye erişebiliriz.</p>
<p>Öncelikle örneğimizin adını yazalım. Zira gizli üyeye bu ad üzerinden
erişeceğiz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ahmet</span><span class="o">.</span>
</pre></div>
</div>
<p>Şimdi bulandırma işlemini uygulamaya geçebiliriz.</p>
<p>Öncelikle bir alt çizgi ekleyelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ahmet</span><span class="o">.</span><span class="n">_</span>
</pre></div>
</div>
<p>Daha sonra sınıf adını iliştirelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ahmet</span><span class="o">.</span><span class="n">_Çalışan</span>
</pre></div>
</div>
<p>Son olarak da gizli üyenin kendisini yazalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ahmet</span><span class="o">.</span><span class="n">_Çalışan__personele_ekle</span><span class="p">()</span>
<span class="go">Ahmet adlı kişi personele eklendi.</span>
</pre></div>
</div>
<p>Gayet başarılı…</p>
<p>Yalnız buraya şöyle bir not düşelim: Her ne kadar Python bize gizli üyelere
erişme imkanı sunsa da, başkasının yazdığı kodları kullanırken, o kodlardaki
gizli üyelere erişmeye çalışmamak çoğu zaman iyi bir fikirdir. Nihayetinde eğer
bir programcı, bir sınıf üyesini gizlemişse bunun bir nedeni vardır. Eğer
erişmenizin istenmediği bir üyeye erişirseniz ve bunun sonucunda birtakım
sorunlarla karşılaşırsanız bu durum o programı yazan programcının değil, tamamen
sizin kabahatinizdir. Python programcılarının da sık sık söylediği gibi:
‘Neticede hepimiz, doğruyu yanlışı bilen, yetişkin insanlarız.’</p>
</div>
<div class="section" id="yari-gizli-uyeler">
<h3>Yarı-gizli Üyeler<a class="headerlink" href="#yari-gizli-uyeler" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Buraya kadar Python’a dair anlattığımız şeylerden, yerleşmiş adetlerin ve
geleneklerin Python açısından ne kadar önemli olduğunu anlamış olmalısınız. Daha
önce verdiğimiz örnekler, bu dildeki pek çok meselenin uzlaşma esası üzerinden
çözüme kavuşturulduğunu bize açık ve seçik olarak gösterdi. Mesela geçen
bölümlerde ele aldığımız <cite>self</cite> ve <cite>cls</cite> kelimeleri tamamen uzlaşmaya dayalı
kavramlardır. Python topluluğu içinde, <cite>self</cite> kelimesinin örnek metotları için,
<cite>cls</cite> kelimesinin ise sınıf metotları için kullanılması tamamen bir alışkanlık,
adet, gelenek ve uzlaşı meselesidir. Python’ın kendisi bize bu kelimeleri
dayatmaz. Ancak topluluk içinde süregelen kuvvetli gelenekler bizi başka
kelimeleri değil de yukarıdaki kelimeleri kullanmaya teşvik eder. Aynı şekilde
kod yazarken girinti sayısının dört boşluk olarak belirlenmiş olması da bir
gelenekten ibarettir. Yazdığınız kodlarda, aynı program içinde hep aynı sayıda
olmak şartıyla, istediğiniz sayıda boşluktan oluşan girintiler
kullanabilirsiniz. Ama Python’ın topluluk içi gelenekleri bizi dört boşlukluk
bir girintileme sistemi kullanmaya yöneltir.</p>
<p>İşte tıpkı yukarıdakiler gibi, Python’daki sınıf üyelerinin dışa açık veya dışa
kapalı olup olmaması da hep belli birtakım gelenekler üzerinden belirlenen bir
durumdur.</p>
<p>Bunun bir örneğini, yukarıda gizli üyeleri anlatırken vermiştik. Bir sınıf
içindeki herhangi bir niteliğin başında çift alt çizgi gördüğümüzde, o sınıfı
yazan kişinin, bu niteliğe sınıf dışından erişilmesini istemediğini anlıyoruz.
Python her ne kadar nitelikleri gizlememiz için bize özel bir mekanizma sunmuş
olsa da bu niteliğe erişmemizi tamamen engellemiyor, ancak ilgili sınıfı yazan
kişinin niyetine saygı göstereceğimizi varsayıyor.</p>
<p>Python’da sınıf üyelerinin gizliliği, yukarıda da gördüğümüz gibi, hem özel bir
mekanizma ile hem de topluluk içi gelenekler tarafından korunur.</p>
<p>Python’da bir de yalnızca topluluk içi gelenekler tarafından korunan
‘yarı-gizli’ üyeler (<em>semi-private members</em>) vardır. İşte bu bölümde, bir gizli
üye türü olan yarı-gizli üyelerden söz edeceğiz.</p>
<p>Yarı-gizli üyeler, herhangi bir özel mekanizma aracılığıyla değil de yalnızca
topluluk içi gelenekler tarafından korunan niteliklerdir. Herhangi bir üyeyi
yarı-gizli olarak işaretlemek için yapmamız gereken tek şey başına bir adet alt
çizgi yerleştirmektir. Örneğin:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Falanca</span><span class="p">():</span>
<span class="n">_yarıgizli</span> <span class="o">=</span> <span class="s1">'yarıgizli'</span>
</pre></div>
</div>
<p>Buradaki <cite>_yarıgizli</cite> adlı niteliğe sınıf içinden veya dışından erişmemizi
engelleyen veya zorlaştıran hiçbir mekanizma bulunmaz. Ama biz bir sınıf içinde
tek alt çizgi ile başlayan bir öğe gördüğümüzde, bunun sınıfın iç işleyişine
ilişkin bir ayrıntı olduğunu, sınıf dışından bu öğeyi değiştirmeye kalkışmamamız
gerektiğini anlarız.</p>
</div>
</div>
<div class="section" id="property-bezeyicisi">
<h2>@property Bezeyicisi<a class="headerlink" href="#property-bezeyicisi" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Yukarıda aleni, gizli ve yarı-gizli sınıf üyelerinden söz ettik. İsterseniz
özellikle yarı-gizli öğelerin kullanıldığı bir kod örneği vererek yukarıda
anlattıklarımızı somut bir örnek üzerinden netleştirmeye çalışalım.</p>
<p>Diyelim ki şöyle bir kod yazdık:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Çalışan</span><span class="p">():</span>
<span class="n">personel</span> <span class="o">=</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="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">personele_ekle</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada personel veritabanına kişi eklememizi ve veritabanındaki kişileri
görüntülememizi sağlayan birtakım metotlar var.</p>
<p>Bu metotları şöyle kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">calisan</span> <span class="kn">import</span> <span class="n">Çalışan</span>
<span class="gp">>>> </span><span class="n">ç1</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">)</span>
<span class="go">Ahmet adlı kişi personele eklendi</span>
<span class="gp">>>> </span><span class="n">ç2</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="p">(</span><span class="s1">'Mehmet'</span><span class="p">)</span>
<span class="go">Mehmet adlı kişi personele eklendi</span>
<span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personeli_görüntüle</span><span class="p">()</span>
<span class="go">Personel listesi:</span>
<span class="go">Ahmet</span>
<span class="go">Mehmet</span>
</pre></div>
</div>
<p>Peki eğer kodlarımızı kullananlar personel listesindeki bir kişinin ismini
sonradan değiştirmek isterse ne yapacak?</p>
<p>Kodlarımız içinde, isim değişikliği yapılmasını sağlayan özel bir metot yok.
Dolayısıyla kodlarımızı kullananlar, doğrudan <cite>isim</cite> adlı örnek değişkenine
erişerek isim değişikliğini şu şekilde yapabilir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ç1</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="s1">'Selim'</span>
</pre></div>
</div>
<p>Bu şekilde ‘Ahmet’ adlı kişinin ismini değiştirdik. Bunu teyit edelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">ç1</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="go">Selim</span>
</pre></div>
</div>
<p>Ancak burada şöyle bir sorun var. Bu isim değişikliği personel listesine
yansımadı. Kontrol edelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personeli_görüntüle</span><span class="p">()</span>
<span class="go">Personel listesi:</span>
<span class="go">Ahmet</span>
<span class="go">Mehmet</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, ‘Ahmet’ ismi hâlâ orada duruyor. Bu sorunu gidermek için,
personel listesine de müdahale edilmesi gerekir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">kişi</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="o">.</span><span class="n">personel</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personel</span><span class="p">[</span><span class="n">kişi</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Selim'</span>
</pre></div>
</div>
<p>Burada öncelikle listelerin <code class="docutils literal notranslate"><span class="pre">index()</span></code> metodunu kullanarak, değiştirmek
istediğimiz kişinin <cite>personel</cite> listesindeki sırasını bulduk. Daha sonra da bu
bilgiyi kullanarak listede gerekli değişikliği yaptık.</p>
<p>Personel listesini tekrar kontrol ettiğimizde her şeyin yolunda olduğunu
görebiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personeli_görüntüle</span><span class="p">()</span>
<span class="go">Personel listesi:</span>
<span class="go">Selim</span>
<span class="go">Mehmet</span>
</pre></div>
</div>
<p>Ancak bunun hiç kullanışlı bir yöntem olmadığı çok açık. Basit bir isim
değişikliği için, kullanıcılarımız bir sürü kod yazmak zorunda kalıyor.
Kullanıcılarımızın hayatını kolaylaştırmak için onlara pratik bir metot
sunabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Çalışan</span><span class="p">():</span>
<span class="n">personel</span> <span class="o">=</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="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">personele_ekle</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">isim_değiştir</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">yeni_isim</span><span class="p">):</span>
<span class="n">kişi</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">personel</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">personel</span><span class="p">[</span><span class="n">kişi</span><span class="p">]</span> <span class="o">=</span> <span class="n">yeni_isim</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'yeni isim:'</span><span class="p">,</span> <span class="n">yeni_isim</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">isim_değiştir()</span></code> adlı yeni bir fonksiyon tanımladık. Artık
kodlarımızdan istifade edenler yalnızca bu yeni fonksiyonu kullanarak, personele
önceden ekledikleri kişilerin ismini kolayca değiştirebilir:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">calisan</span> <span class="kn">import</span> <span class="n">Çalışan</span>
<span class="gp">>>> </span><span class="n">ç1</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="p">(</span><span class="s1">'Ahmet'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">ç2</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="p">(</span><span class="s1">'Mehmet'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">ç3</span> <span class="o">=</span> <span class="n">Çalışan</span><span class="p">(</span><span class="s1">'Selim'</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personeli_görüntüle</span><span class="p">()</span>
<span class="go">Personel listesi:</span>
<span class="go">Ahmet</span>
<span class="go">Mehmet</span>
<span class="go">Selim</span>
<span class="gp">>>> </span><span class="n">ç1</span><span class="o">.</span><span class="n">isim_değiştir</span><span class="p">(</span><span class="s1">'Emre'</span><span class="p">)</span>
<span class="go">yeni isim: Emre</span>
<span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personeli_görüntüle</span><span class="p">()</span>
<span class="go">Personel listesi:</span>
<span class="go">Emre</span>
<span class="go">Mehmet</span>
<span class="go">Selim</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, kodlarımız gayet güzel çalışıyor. Bu noktadan sonra, <strong>eğer
arzu ederseniz</strong>, kullanıcılarınızın <cite>personel</cite> ve <cite>self.isim</cite> adlı değişkenlere
doğrudan erişmesini engellemek için bunları tek alt çizgi veya çift alt çizgi
kullanarak gizleyebilirsiniz.</p>
<p>Çift alt çizgi ile:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Çalışan</span><span class="p">():</span>
<span class="n">__personel</span> <span class="o">=</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="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">personele_ekle</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__isim</span><span class="p">))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">isim_değiştir</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">yeni_isim</span><span class="p">):</span>
<span class="n">kişi</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__personel</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__isim</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__personel</span><span class="p">[</span><span class="n">kişi</span><span class="p">]</span> <span class="o">=</span> <span class="n">yeni_isim</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'yeni isim: '</span><span class="p">,</span> <span class="n">yeni_isim</span><span class="p">)</span>
</pre></div>
</div>
<p>Tek alt çizgi ile:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Çalışan</span><span class="p">():</span>
<span class="n">_personel</span> <span class="o">=</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="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">personele_ekle</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_isim</span><span class="p">))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">isim_değiştir</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">yeni_isim</span><span class="p">):</span>
<span class="n">kişi</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_personel</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_isim</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_personel</span><span class="p">[</span><span class="n">kişi</span><span class="p">]</span> <span class="o">=</span> <span class="n">yeni_isim</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'yeni isim: '</span><span class="p">,</span> <span class="n">yeni_isim</span><span class="p">)</span>
</pre></div>
</div>
<p><cite>personel</cite> ve <cite>self.isim</cite> adlı nitelikleri çift alt çizgi ile gizlediğimizde
Python’ın isim bulandırma mekanizmasını işleteceğini, tek alt çizgi ile
gizlediğimizde ise bu mekanizmanın işletilmeyeceğini biliyorsunuz.</p>
<p>Peki size şöyle bir soru sorayım:</p>
<p>Acaba, personel listesindeki bir ismi, mesela yalnızca şöyle bir komut vererek
değiştiremez miyiz?</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ç1</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="s1">'Emre'</span>
</pre></div>
</div>
<p>Elbette değiştirebiliriz. Ancak bunun için özel bir araçtan yararlanmamız
gerekir. Bu iş için <cite>@property</cite> adlı özel bir bezeyiciyi kullanacağız.</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">Çalışan</span><span class="p">():</span>
<span class="n">_personel</span> <span class="o">=</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="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">personele_ekle</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">personele_ekle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_personel</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_isim</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'</span><span class="si">{}</span><span class="s1"> adlı kişi personele eklendi'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_isim</span><span class="p">))</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">personeli_görüntüle</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Personel listesi:'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">kişi</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_personel</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">kişi</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">isim</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_isim</span>
<span class="nd">@isim</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">isim</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">yeni_isim</span><span class="p">):</span>
<span class="n">kişi</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_personel</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">isim</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_personel</span><span class="p">[</span><span class="n">kişi</span><span class="p">]</span> <span class="o">=</span> <span class="n">yeni_isim</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'yeni isim: '</span><span class="p">,</span> <span class="n">yeni_isim</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu kodları çalıştırdığınızda, tıpkı yukarıda bahsettiğimiz gibi, herhangi bir
çalışanın ismini yalnızca şu şekilde değiştirebildiğinizi göreceksiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">ç1</span><span class="o">.</span><span class="n">isim</span> <span class="o">=</span> <span class="s1">'Emre'</span>
</pre></div>
</div>
<p>Üstelik bu kod, isim değişikliğinin personel listesine de yansımasını sağlıyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Çalışan</span><span class="o">.</span><span class="n">personeli_görüntüle</span><span class="p">()</span>
<span class="go">Emre</span>
</pre></div>
</div>
<p>Birazdan bu kodları derinlemesine inceleyeceğiz. Ama isterseniz öncelikle şu
<cite>@property</cite> bezeyicisinden biraz söz edelim. Böylelikle yukarıdaki kodları
anlamamız kolaylaşır.</p>
<div class="section" id="metottan-nitelige">
<h3>Metottan Niteliğe<a class="headerlink" href="#metottan-nitelige" title="Bu başlık için kalıcı bağlantı">¶</a></h3>
<p>Şimdiye kadar verdiğimiz örneklerden anlamış olabileceğiniz gibi, bir sınıf
içinde salt verileri tutan değişkenlere ‘nitelik’ adı veriyoruz. Mesela:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Falanca</span><span class="p">():</span>
<span class="n">nitelik</span> <span class="o">=</span> <span class="s1">'nitelik'</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="bp">self</span><span class="o">.</span><span class="n">nitelik</span> <span class="o">=</span> <span class="s1">'nitelik'</span>
</pre></div>
</div>
<p>Burada <cite>nitelik</cite> bir sınıf niteliği, <cite>self.nitelik</cite> ise bir örnek niteliğidir.</p>
<p>Buna karşılık, bir sınıf içinde fonksiyon biçiminde yer alan ve bir işlemi veya
prosedürü yerine getiren öğelere ise metot adı veriyoruz. Mesela:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Falanca</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="k">pass</span>
<span class="k">def</span> <span class="nf">örnek_fonk</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_fonk</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_fonk</span><span class="p">():</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">örnek_fonk()</span></code> adlı fonksiyon bir örnek metodu, <code class="docutils literal notranslate"><span class="pre">sınıf_fonk()</span></code> adlı
fonksiyon bir sınıf metodu, <code class="docutils literal notranslate"><span class="pre">statik_fonk()</span></code> adlı fonksiyon ise bir statik
metottur. Metotlar ile niteliklerin gerçekleştirebilecekleri işlemlerin
karmaşıklığının birbirinden farklı olmasının yanı sıra, bunlar arasında kullanım
açısından da farklılık vardır. Mesela <code class="docutils literal notranslate"><span class="pre">Falanca()</span></code> sınıfı içindeki <cite>nitelik</cite>
adlı sınıf niteliğini şu şekilde kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Falanca</span><span class="o">.</span><span class="n">nitelik</span>
<span class="gp">>>> </span><span class="n">Falanca</span><span class="o">.</span><span class="n">nitelik</span> <span class="o">=</span> <span class="s1">'yeni değer'</span>
</pre></div>
</div>
<p>Aynı sınıf içindeki <code class="docutils literal notranslate"><span class="pre">sınıf_fonk()</span></code> adlı sınıf metoduna ise şöyle erişiyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Falanca</span><span class="o">.</span><span class="n">sınıf_fonk</span><span class="p">()</span>
</pre></div>
</div>
<p>Niteliklerin aksine, metotlarda atama yoluyla değer değiştirme gibi bir şey söz
konusu değildir. Yani şuna benzer bir şey yazamayız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Falanca</span><span class="o">.</span><span class="n">sınıf_fonk</span><span class="p">()</span> <span class="o">=</span> <span class="s1">'yeni değer'</span>
</pre></div>
</div>
<p>Eğer metot bir parametre alıyorsa (yukarıdaki örneklerde metotlar parametre
almıyor), bu parametreyi kullanarak metotla iletişim kurabiliriz. Mesela:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Falanca</span><span class="o">.</span><span class="n">sınıf_fonk</span><span class="p">(</span><span class="n">yeni_değer</span><span class="p">)</span>
</pre></div>
</div>
<p><em>Property</em> kelimesi (<em>attribute</em> kelimesine benzer bir şekilde) İngilizcede
‘özellik, nitelik’ gibi anlamlara gelir. Kelime anlamına uygun olarak,
<cite>@property</cite> bezeyicisinin yaptığı en temel iş, bir metodu, nitelik gibi
kullanılabilecek hale getirmektir. Çok basit bir örnek verelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Program</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="k">pass</span>
<span class="k">def</span> <span class="nf">versiyon</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'0.1'</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">versiyon()</span></code> adlı bir örnek metodu tanımladık. Bu programı şöyle
kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">program</span> <span class="o">=</span> <span class="n">Program</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">program</span><span class="o">.</span><span class="n">versiyon</span><span class="p">()</span>
<span class="go">'0.1'</span>
</pre></div>
</div>
<p>Şimdi programımızda şu değişikliği yapalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Program</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="k">pass</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">versiyon</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'0.1'</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">versiyon()</span></code> adlı metodu <cite>@property</cite> bezeyicisi ile ‘bezedik’. Böylece
bu metodu bir ‘nitelik’ haline getirmiş olduk. Artık bunu şöyle kullanabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">program</span> <span class="o">=</span> <span class="n">Program</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">program</span><span class="o">.</span><span class="n">versiyon</span>
<span class="go">'0.1'</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">versiyon()</span></code> fonksiyonunu, <cite>@property</cite> bezeyicisi yardımıyla bir niteliğe
dönüştürdüğümüz için, artık bu fonksiyonu parantezsiz kullandığımıza dikkat
edin.</p>
<p>Gördüğünüz gibi, <cite>@property</cite> bezeyicisinin ilk görevi bir metodu niteliğe
dönüştürmek. Peki acaba neden bir metodu niteliğe dönüştürmek istiyor
olabiliriz?</p>
<p>Şöyle bir program yazdığınızı düşünün:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Program</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="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="mi">0</span>
</pre></div>
</div>
<p>Yazdığınız bu programı kullananlar, sınıf içindeki <cite>data</cite> niteliğine şu şekilde
erişiyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span> <span class="o">=</span> <span class="n">Program</span><span class="p">()</span>
<span class="gp">>>> </span><span class="n">p</span><span class="o">.</span><span class="n">data</span>
<span class="go">0</span>
</pre></div>
</div>
<p>Hatta duruma göre bu niteliği şu şekilde değişikliğe de uğratıyor:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">p</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="mi">1</span>
</pre></div>
</div>
<p>Günün birinde, ‘data’ kelimesi yerine ‘veri’ kelimesinin daha uygun olduğunu
düşünerek, ‘data’ kelimesini ‘veri’ olarak değiştirmek istediğinizi varsayalım.
Bunun için kodlarınızda şu değişikliği yapabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Program</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="bp">self</span><span class="o">.</span><span class="n">veri</span> <span class="o">=</span> <span class="mi">0</span>
</pre></div>
</div>
<p>Ancak bu şekilde, programınızı eskiden beri kullananların, sizin yazdığınız bu
programı temel alarak oluşturdukları programları bozmuş oldunuz… Çünkü eğer bu
programdan faydalanan birisi, yazdığı kodda eski <cite>self.data</cite> değişkenini
kullanmışsa, yukarıdaki isim değişikliği yüzünden programı kullanılamaz hale
gelecektir. İşte bunu önlemek için <cite>@property</cite> bezeyicisini kullanabilirsiniz.</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">Program</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="bp">self</span><span class="o">.</span><span class="n">veri</span> <span class="o">=</span> <span class="mi">0</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>