{"id":32744,"date":"2025-10-25T12:31:41","date_gmt":"2025-10-25T09:31:41","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/"},"modified":"2025-10-25T12:31:41","modified_gmt":"2025-10-25T09:31:41","slug":"python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/","title":{"rendered":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus&#8230;"},"content":{"rendered":"<article>\n<h1>Python S\u0131n\u0131f De\u011fi\u015fkenleri: Beklenmedik Davran\u0131\u015flar\u0131n S\u0131rr\u0131<\/h1>\n<p>Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor musunuz? Bu kapsaml\u0131 rehber, ortak tuzaklar\u0131 anlaman\u0131za ve kodunuzu g\u00fc\u00e7lendirmenize yard\u0131mc\u0131 olacak.<\/p>\n<p>Python, nesne y\u00f6nelimli programlama (OOP) ilkelerini g\u00fc\u00e7l\u00fc ve esnek bir \u015fekilde uygulaman\u0131z\u0131 sa\u011flayan harika bir dildir. Ancak, s\u0131n\u0131f de\u011fi\u015fkenleri ve \u00f6rnek de\u011fi\u015fkenleri aras\u0131ndaki ince ayr\u0131mlar, \u00f6zellikle yeni ba\u015flayanlar ve hatta deneyimli geli\u015ftiriciler i\u00e7in bile zaman zaman beklenmedik sorunlara yol a\u00e7abilir. &#8220;Neden bu de\u011feri de\u011fi\u015ftirdi\u011fimde di\u011fer t\u00fcm \u00f6rnekler de etkilendi?&#8221; veya &#8220;Ben sadece bu nesnenin \u00f6zelli\u011fini de\u011fi\u015ftirmek istemi\u015ftim, neden s\u0131n\u0131f\u0131n genel davran\u0131\u015f\u0131 de\u011fi\u015fti?&#8221; gibi sorularla kar\u015f\u0131la\u015ft\u0131ysan\u0131z, yaln\u0131z de\u011filsiniz. Asl\u0131nda, bu durum Python&#8217;\u0131n bellek y\u00f6netimi ve nesne referanslar\u0131n\u0131 ele alma bi\u00e7iminden kaynaklanan derinlemesine bir konudur.<\/p>\n<p>Bu makalede, Python s\u0131n\u0131f de\u011fi\u015fkenlerinin ard\u0131ndaki s\u0131r perdesini aralayaca\u011f\u0131z. Temel kavramlardan ba\u015flayarak, s\u0131k\u00e7a yap\u0131lan hatalar\u0131 ve bunlar\u0131n ger\u00e7ek d\u00fcnyadaki etkilerini vaka analizleri ile inceleyece\u011fiz. Amac\u0131m\u0131z, s\u0131n\u0131f de\u011fi\u015fkenlerini ne zaman ve nas\u0131l kullanman\u0131z gerekti\u011fini net bir \u015fekilde anlaman\u0131z\u0131 sa\u011flamak, b\u00f6ylece daha sa\u011flam, \u00f6ng\u00f6r\u00fclebilir ve hatas\u0131z Python kodlar\u0131 yazabilmenizdir. Haz\u0131rsan\u0131z, bu ilgin\u00e7 yolculu\u011fa \u00e7\u0131kal\u0131m ve Python&#8217;\u0131n inceliklerini ke\u015ffedelim.<\/p>\n<p>Python&#8217;da nesne y\u00f6nelimli programlaman\u0131n temel ta\u015flar\u0131ndan ikisi, s\u0131n\u0131f de\u011fi\u015fkenleri ve \u00f6rnek de\u011fi\u015fkenleridir. Bu iki t\u00fcr de\u011fi\u015fken aras\u0131ndaki fark\u0131 anlamak, kodunuzun bekledi\u011finiz gibi \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Peki, tam olarak nedir bu farklar ve kodumuzda nas\u0131l bir etki yarat\u0131rlar?<\/p>\n<p>\u00d6ncelikle, <strong>s\u0131n\u0131f de\u011fi\u015fkenleri<\/strong> bir s\u0131n\u0131f\u0131n t\u00fcm \u00f6rnekleri (nesneleri) taraf\u0131ndan payla\u015f\u0131lan de\u011fi\u015fkenlerdir. Bir s\u0131n\u0131f\u0131n tan\u0131m\u0131n\u0131n hemen alt\u0131na, herhangi bir metodun veya <code>__init__<\/code> metodunun d\u0131\u015f\u0131nda tan\u0131mlan\u0131rlar. Bu, bir s\u0131n\u0131f de\u011fi\u015fkeninin de\u011ferini de\u011fi\u015ftirdi\u011finizde, bu s\u0131n\u0131f\u0131n olu\u015fturulmu\u015f t\u00fcm \u00f6rneklerinin o yeni de\u011feri yans\u0131taca\u011f\u0131 anlam\u0131na gelir. Yani, bu de\u011fi\u015fkenler, s\u0131n\u0131f\u0131n kendi belle\u011finde tutulur ve t\u00fcm \u00f6rnekler ayn\u0131 bellek konumuna i\u015faret eder. Genellikle, bir s\u0131n\u0131f\u0131n t\u00fcm \u00f6rnekleri i\u00e7in sabit kalmas\u0131 gereken de\u011ferleri (\u00f6rne\u011fin, bir sabit say\u0131, bir yap\u0131land\u0131rma ayar\u0131 veya t\u00fcm \u00f6rneklerin say\u0131s\u0131n\u0131 tutan bir saya\u00e7) depolamak i\u00e7in kullan\u0131l\u0131rlar. Bir \u00f6rnek verelim:<\/p>\n<pre><code>\nclass Araba:\n    # Bu bir s\u0131n\u0131f de\u011fi\u015fkenidir. T\u00fcm Araba \u00f6rnekleri taraf\u0131ndan payla\u015f\u0131l\u0131r.\n    tekerlek_sayisi = 4 \n\n    def __init__(self, marka, model):\n        self.marka = marka  # Bu bir \u00f6rnek de\u011fi\u015fkenidir. Her araba i\u00e7in farkl\u0131d\u0131r.\n        self.model = model  # Bu da bir \u00f6rnek de\u011fi\u015fkenidir.\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>tekerlek_sayisi<\/code> bir s\u0131n\u0131f de\u011fi\u015fkenidir. Olu\u015fturaca\u011f\u0131n\u0131z her <code>Araba<\/code> nesnesi otomatik olarak 4 tekerle\u011fe sahip olacakt\u0131r. <code>marka<\/code> ve <code>model<\/code> ise \u00f6rnek de\u011fi\u015fkenleridir; her araban\u0131n kendi markas\u0131 ve modeli olacakt\u0131r. Bir di\u011fer deyi\u015fle, s\u0131n\u0131f de\u011fi\u015fkenleri s\u0131n\u0131f\u0131n kimli\u011finin bir par\u00e7as\u0131yken, \u00f6rnek de\u011fi\u015fkenleri her bir nesnenin benzersiz kimli\u011finin bir par\u00e7as\u0131d\u0131r.<\/p>\n<p>Di\u011fer yandan, <strong>\u00f6rnek de\u011fi\u015fkenleri<\/strong> (bazen nesne de\u011fi\u015fkenleri olarak da adland\u0131r\u0131l\u0131r), s\u0131n\u0131f\u0131n her \u00f6rne\u011fi i\u00e7in ayr\u0131 ayr\u0131 tan\u0131mlanan ve depolanan de\u011fi\u015fkenlerdir. Bu de\u011fi\u015fkenler genellikle <code>__init__<\/code> metodunun i\u00e7inde <code>self.degisken_adi = deger<\/code> \u015feklinde tan\u0131mlan\u0131r. Her nesne kendi \u00f6rnek de\u011fi\u015fkenlerinin bir kopyas\u0131na sahiptir ve bir nesnenin \u00f6rnek de\u011fi\u015fkenindeki bir de\u011fi\u015fikli\u011fin di\u011fer nesneler \u00fczerinde hi\u00e7bir etkisi olmaz. Bu, onlar\u0131n ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 ve \u00f6zerkli\u011fini sa\u011flar. Bu ayr\u0131m, karma\u015f\u0131k uygulamalar geli\u015ftirirken nesneler aras\u0131nda veri izolasyonu sa\u011flamak i\u00e7in hayati \u00f6neme sahiptir. E\u011fer bir \u00f6rnek de\u011fi\u015fkeni yanl\u0131\u015fl\u0131kla s\u0131n\u0131f de\u011fi\u015fkeni olarak tan\u0131mlan\u0131rsa veya tam tersi olursa, kodunuzda mant\u0131ksal hatalar meydana gelebilir ve bu hatalar\u0131n tespiti zaman al\u0131c\u0131 olabilir.<\/p>\n<p>Bellek y\u00f6netimi a\u00e7\u0131s\u0131ndan bak\u0131ld\u0131\u011f\u0131nda, s\u0131n\u0131f de\u011fi\u015fkenleri bellekte yaln\u0131zca bir kez depolan\u0131rken, \u00f6rnek de\u011fi\u015fkenleri her nesne olu\u015fturuldu\u011funda ayr\u0131 ayr\u0131 depolan\u0131r. Bu, \u00e7ok say\u0131da nesne \u00f6rne\u011fi olu\u015fturuldu\u011funda performans ve bellek kullan\u0131m\u0131 a\u00e7\u0131s\u0131ndan \u00f6nemli olabilir. Bu nedenle, bir verinin t\u00fcm nesneler i\u00e7in ayn\u0131 olmas\u0131 gerekiyorsa, onu s\u0131n\u0131f de\u011fi\u015fkeni olarak tan\u0131mlamak hem daha verimli hem de mant\u0131ksal olarak daha do\u011frudur. Ancak, bu durum, \u00f6zellikle de\u011fi\u015fkenlerin \"mutable\" (de\u011fi\u015ftirilebilir) t\u00fcrde olmas\u0131 halinde baz\u0131 tuzaklar\u0131 da beraberinde getirebilir ki bunu bir sonraki b\u00f6l\u00fcmde daha detayl\u0131 inceleyece\u011fiz. K\u0131sacas\u0131, bu iki kavram aras\u0131ndaki net ayr\u0131m\u0131 anlamak, Python'da sa\u011flam ve s\u00fcrd\u00fcr\u00fclebilir kod yazman\u0131n temelini olu\u015fturur. Bu bilgiyi i\u00e7selle\u015ftirmek, pek \u00e7ok gizemli hatan\u0131n \u00f6n\u00fcne ge\u00e7menizi sa\u011flayacakt\u0131r.<\/p>\n<h2 id=\"beklenmedik-davranislar\">S\u0131n\u0131f De\u011fi\u015fkenlerinin Beklenmedik Davran\u0131\u015flar\u0131 Nereden Kaynaklan\u0131yor?<\/h2>\n<p>S\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen beklentilerimizin d\u0131\u015f\u0131nda davrand\u0131\u011f\u0131n\u0131 anlamak i\u00e7in Python'\u0131n nas\u0131l nitelik (attribute) \u00e7\u00f6z\u00fcmlemesi yapt\u0131\u011f\u0131n\u0131 ve nesne referanslar\u0131n\u0131 nas\u0131l ele ald\u0131\u011f\u0131n\u0131 derinlemesine incelememiz gerekir. Bu \"beklenmedik\" davran\u0131\u015flar\u0131n temelinde yatan ana mekanizma, <strong>g\u00f6lgeleme (shadowing)<\/strong> kavram\u0131d\u0131r ve bu, Python'\u0131n de\u011fi\u015fken atama kurallar\u0131 ile yak\u0131ndan ili\u015fkilidir.<\/p>\n<p>Python'da bir nesnenin bir niteli\u011fine eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda (\u00f6rne\u011fin <code>nesne.nitelik<\/code>), Python \u00f6ncelikle bu niteli\u011fi nesnenin kendi \u00f6rnek de\u011fi\u015fkenlerinde arar. E\u011fer nitelik orada bulunamazsa, Python daha sonra s\u0131n\u0131f\u0131n ve onun \u00fcst s\u0131n\u0131flar\u0131n\u0131n (method resolution order - MRO'ya g\u00f6re) niteliklerine bakar. Bu arama s\u0131ras\u0131, \u00e7o\u011fu zaman sezgiseldir ve do\u011fru sonu\u00e7lar verir. Ancak, bir atama i\u015flemi devreye girdi\u011finde, i\u015fler biraz karma\u015f\u0131kla\u015f\u0131r.<\/p>\n<p>En kritik nokta \u015fudur: <strong><code>nesne.degisken = yeni_deger<\/code> \u015feklinde bir atama yapt\u0131\u011f\u0131n\u0131zda, Python o de\u011fi\u015fkene do\u011frudan s\u0131n\u0131f\u0131n tan\u0131m\u0131nda de\u011fil, o spesifik nesnenin kendi s\u00f6zl\u00fc\u011f\u00fcnde (<code>__dict__<\/code>) yeni bir \u00f6rnek de\u011fi\u015fkeni olu\u015fturur veya var olan\u0131 g\u00fcnceller.<\/strong> Bu yeni \u00f6rnek de\u011fi\u015fkeni, s\u0131n\u0131f de\u011fi\u015fkenini <strong>g\u00f6lgeler<\/strong>. Yani, o nesne i\u00e7in art\u0131k s\u0131n\u0131f de\u011fi\u015fkenine de\u011fil, kendi \u00f6rnek de\u011fi\u015fkenine eri\u015filir. Di\u011fer nesneler veya do\u011frudan s\u0131n\u0131f \u00fczerinden eri\u015fim ise hala orijinal s\u0131n\u0131f de\u011fi\u015fkenini g\u00f6r\u00fcr.<\/p>\n<pre><code>\nclass Ayar:\n    varsayilan_dil = \"T\u00fcrk\u00e7e\" # S\u0131n\u0131f de\u011fi\u015fkeni\n\nsunucu_ayari = Ayar()\nkullanici_ayari = Ayar()\n\nprint(f\"Sunucu dil (ba\u015flang\u0131\u00e7): {sunucu_ayari.varsayilan_dil}\") # T\u00fcrk\u00e7e\nprint(f\"Kullan\u0131c\u0131 dil (ba\u015flang\u0131\u00e7): {kullanici_ayari.varsayilan_dil}\") # T\u00fcrk\u00e7e\n\nsunucu_ayari.varsayilan_dil = \"\u0130ngilizce\" # BURADA YEN\u0130 B\u0130R \u00d6RNEK DE\u011e\u0130\u015eKEN\u0130 OLU\u015eTURULUR!\n\nprint(f\"Sunucu dil (sonra): {sunucu_ayari.varsayilan_dil}\") # \u0130ngilizce\nprint(f\"Kullan\u0131c\u0131 dil (sonra): {kullanici_ayari.varsayilan_dil}\") # T\u00fcrk\u00e7e - hala ayn\u0131!\nprint(f\"S\u0131n\u0131f dili (do\u011frudan): {Ayar.varsayilan_dil}\") # T\u00fcrk\u00e7e - hala ayn\u0131!\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>sunucu_ayari.varsayilan_dil = \"\u0130ngilizce\"<\/code> dedi\u011fimizde, Python <code>sunucu_ayari<\/code> nesnesinin kendi i\u00e7inde <code>varsayilan_dil<\/code> ad\u0131nda yeni bir nitelik olu\u015fturdu ve ona \"\u0130ngilizce\" de\u011ferini atad\u0131. Bu atama i\u015flemi, <code>Ayar.varsayilan_dil<\/code> s\u0131n\u0131f de\u011fi\u015fkenini etkilemedi. Dolay\u0131s\u0131yla, <code>kullanici_ayari<\/code> hala s\u0131n\u0131f de\u011fi\u015fkenine bakt\u0131\u011f\u0131 i\u00e7in \"T\u00fcrk\u00e7e\" de\u011ferini d\u00f6nd\u00fcrd\u00fc.<\/p>\n<p>Bu mekanizma, s\u0131n\u0131f de\u011fi\u015fkenlerinin de\u011fi\u015ftirilebilir (mutable) veri tipleri (listeler, s\u00f6zl\u00fckler gibi) olmas\u0131 durumunda daha da kafa kar\u0131\u015ft\u0131r\u0131c\u0131 hale gelir. E\u011fer bir s\u0131n\u0131f de\u011fi\u015fkeni bir liste olsayd\u0131 ve bir nesne bu listeye <code>.append()<\/code> gibi bir metotla eleman eklemeye \u00e7al\u0131\u015fsayd\u0131, o zaman liste ger\u00e7ekten de t\u00fcm nesneler i\u00e7in de\u011fi\u015fecekti. \u00c7\u00fcnk\u00fc <code>.append()<\/code> bir atama i\u015flemi de\u011fil, mevcut nesne \u00fczerinde bir metot \u00e7a\u011fr\u0131s\u0131d\u0131r ve o nesnenin referans etti\u011fi bellek adresindeki veriyi de\u011fi\u015ftirir. Bu, Python'\u0131n pass-by-object-reference (nesne referans\u0131 ile ge\u00e7irme) modelinden kaynaklan\u0131r. Python'da de\u011fi\u015fkenler do\u011frudan de\u011ferleri tutmaz; bunun yerine nesnelere referans tutarlar. Bu temel prensibi anlamak, Python'da veri manip\u00fclasyonunun nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kavraman\u0131n anahtar\u0131d\u0131r.<\/p>\n<div class=\"expert-tip\">\n  <strong>Uzman \u0130pucu:<\/strong> S\u0131n\u0131f de\u011fi\u015fkenlerini de\u011fi\u015ftirirken daima bilin\u00e7li olun. E\u011fer amac\u0131n\u0131z ger\u00e7ekten s\u0131n\u0131f\u0131n ortak durumunu de\u011fi\u015ftirmekse, bunu <code>ClassName.variable = new_value<\/code> \u015feklinde veya bir s\u0131n\u0131f metodu (<code>@classmethod<\/code>) arac\u0131l\u0131\u011f\u0131yla yap\u0131n. Aksi takdirde, \u00f6rnek de\u011fi\u015fkeni olu\u015fturma riskini alm\u0131\u015f olursunuz. Bu yakla\u015f\u0131m, kodunuzun \u00f6ng\u00f6r\u00fclebilirli\u011fini art\u0131r\u0131r ve beklenmedik yan etkileri \u00f6nler.\n<\/div>\n<p>\u00d6zetle, s\u0131n\u0131f de\u011fi\u015fkenlerinin \"beklenmedik\" davran\u0131\u015flar\u0131, Python'\u0131n nitelik \u00e7\u00f6z\u00fcmleme s\u0131ras\u0131 ve atama operasyonlar\u0131n\u0131n do\u011fas\u0131ndan kaynaklan\u0131r. <code>nesne.nitelik = de\u011fer<\/code> ifadesi, genellikle bir s\u0131n\u0131f de\u011fi\u015fkenini de\u011fi\u015ftirmek yerine yeni bir \u00f6rnek de\u011fi\u015fkeni yarat\u0131r ve bu da orijinal s\u0131n\u0131f de\u011fi\u015fkenini g\u00f6lgede b\u0131rak\u0131r. Bu ayr\u0131m\u0131 iyi kavramak, Python'da nesne y\u00f6nelimli programlaman\u0131n inceliklerinde ustala\u015fman\u0131n temelidir ve bir sonraki b\u00f6l\u00fcmde mutable de\u011fi\u015fkenlerin yaratt\u0131\u011f\u0131 tuzaklar\u0131 daha detayl\u0131 inceleyece\u011fiz.<\/p>\n<h3 id=\"mutable-degiskenler\">Mutlak De\u011fi\u015fkenlerin Tuzaklar\u0131: Listeler ve S\u00f6zl\u00fckler Neden Sorun \u00c7\u0131kar\u0131r?<\/h3>\n<p>S\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen beklendi\u011fi gibi davranmad\u0131\u011f\u0131n\u0131 inceledik. Bu durum, \u00f6zellikle s\u0131n\u0131f de\u011fi\u015fkeni olarak de\u011fi\u015ftirilebilir (mutable) veri tipleri (\u00f6rne\u011fin listeler, s\u00f6zl\u00fckler veya setler) kullan\u0131ld\u0131\u011f\u0131nda \u00e7ok daha karma\u015f\u0131k ve yan\u0131lt\u0131c\u0131 hale gelebilir. De\u011fi\u015ftirilebilir nesnelerle \u00e7al\u0131\u015f\u0131rken ortaya \u00e7\u0131kan bu tuzaklar, genellikle yaz\u0131l\u0131mc\u0131lar\u0131 uzun s\u00fcreler boyunca kafa kar\u0131\u015ft\u0131rmakta ve hatalar\u0131n tespiti zorla\u015fmaktad\u0131r.<\/p>\n<p>Python'da, <code>int<\/code>, <code>float<\/code>, <code>str<\/code>, <code>tuple<\/code> gibi veri tipleri de\u011fi\u015ftirilemez (immutable) iken, <code>list<\/code>, <code>dict<\/code>, <code>set<\/code> gibi tipler de\u011fi\u015ftirilebilir (mutable) \u00f6zelliktedir. De\u011fi\u015ftirilemez bir s\u0131n\u0131f de\u011fi\u015fkeni (\u00f6rne\u011fin bir say\u0131) atand\u0131\u011f\u0131nda ve bir \u00f6rnek \u00fczerinden bu de\u011fi\u015fken de\u011fi\u015ftirilmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda, Python yeni bir \u00f6rnek de\u011fi\u015fkeni olu\u015fturarak s\u0131n\u0131f de\u011fi\u015fkenini g\u00f6lgeler. Bu, \u00f6nceki b\u00f6l\u00fcmde a\u00e7\u0131klad\u0131\u011f\u0131m\u0131z \"g\u00f6lgeleme\" davran\u0131\u015f\u0131d\u0131r.<\/p>\n<pre><code>\nclass Urun:\n    stok_seviyesi = 100 # Immutable s\u0131n\u0131f de\u011fi\u015fkeni (int)\n    etiketler = [] # Mutable s\u0131n\u0131f de\u011fi\u015fkeni (list)\n\nurun1 = Urun()\nurun2 = Urun()\n\nprint(f\"Urun1 stok: {urun1.stok_seviyesi}, etiketler: {urun1.etiketler}\") # 100, []\nprint(f\"Urun2 stok: {urun2.stok_seviyesi}, etiketler: {urun2.etiketler}\") # 100, []\n\n# Immutable de\u011fi\u015fkeni de\u011fi\u015ftirmeye \u00e7al\u0131\u015fmak\nurun1.stok_seviyesi = 90 # Bu, urun1 i\u00e7in yeni bir \u00f6rnek de\u011fi\u015fkeni olu\u015fturur.\n\n# Mutable de\u011fi\u015fkeni de\u011fi\u015ftirmeye \u00e7al\u0131\u015fmak (liste metodunu kullanarak)\nurun1.etiketler.append(\"yeni\") # Bu, s\u0131n\u0131f\u0131n etiketler listesini de\u011fi\u015ftirir!\n\nprint(f\"--- De\u011fi\u015fiklikler Sonras\u0131 ---\")\nprint(f\"Urun1 stok: {urun1.stok_seviyesi}, etiketler: {urun1.etiketler}\") # 90, ['yeni']\nprint(f\"Urun2 stok: {urun2.stok_seviyesi}, etiketler: {urun2.etiketler}\") # 100, ['yeni']\nprint(f\"S\u0131n\u0131f\u0131n etiketleri: {Urun.etiketler}\") # ['yeni']\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>urun1.stok_seviyesi = 90<\/code> atamas\u0131, <code>urun1<\/code> nesnesi i\u00e7in \u00f6zel bir <code>stok_seviyesi<\/code> \u00f6rnek de\u011fi\u015fkeni olu\u015fturdu. Bu y\u00fczden <code>urun2.stok_seviyesi<\/code> hala <code>100<\/code> olarak kald\u0131. Ancak, <code>urun1.etiketler.append(\"yeni\")<\/code> i\u015flemi farkl\u0131d\u0131r. Burada bir atama yap\u0131lm\u0131yor; bunun yerine, <code>etiketler<\/code> s\u0131n\u0131f de\u011fi\u015fkeninin referans etti\u011fi listeye (ki bu listeye hem <code>urun1<\/code>, hem <code>urun2<\/code> hem de do\u011frudan <code>Urun<\/code> s\u0131n\u0131f\u0131 eri\u015fiyor) bir eleman ekleniyor. Yani, listede depolanan de\u011fer <strong>referans yoluyla de\u011fi\u015ftiriliyor<\/strong>. Sonu\u00e7 olarak, bu de\u011fi\u015fikli\u011fin hem <code>urun1<\/code> hem de <code>urun2<\/code> \u00fczerinde etkili oldu\u011funu g\u00f6r\u00fcrs\u00fcn\u00fcz, \u00e7\u00fcnk\u00fc her ikisi de ayn\u0131 liste nesnesine i\u015faret etmektedir.<\/p>\n<p>Bu davran\u0131\u015f, \u00f6zellikle varsay\u0131lan parametrelerle metot tan\u0131mlarken de benzer sorunlara yol a\u00e7abilir. \u00d6rne\u011fin, bir metodun varsay\u0131lan parametresi olarak bo\u015f bir liste verdi\u011finizde, bu liste sadece bir kez olu\u015fturulur ve her metot \u00e7a\u011fr\u0131s\u0131nda ayn\u0131 liste referans\u0131 kullan\u0131l\u0131r. Bu da, fonksiyonun farkl\u0131 \u00e7a\u011fr\u0131lar\u0131nda beklenmedik \u015fekilde ayn\u0131 listenin g\u00fcncellenmesine neden olabilir.<\/p>\n<p>Bu t\u00fcr sorunlar\u0131 \u00f6nlemenin en yayg\u0131n yolu, de\u011fi\u015ftirilebilir nesneleri s\u0131n\u0131f de\u011fi\u015fkeni olarak de\u011fil, her \u00f6rne\u011fin kendi <code>__init__<\/code> metodunda, yeni bir kopya olu\u015fturarak tan\u0131mlamakt\u0131r. B\u00f6ylece her \u00f6rnek kendi ba\u011f\u0131ms\u0131z listesine veya s\u00f6zl\u00fc\u011f\u00fcne sahip olur. \u00d6rne\u011fin:<\/p>\n<pre><code>\nclass GuvenliUrun:\n    # stok_seviyesi gibi immutable'lar hala s\u0131n\u0131f de\u011fi\u015fkeni olabilir\n    stok_seviyesi = 100 \n\n    def __init__(self, isim):\n        self.isim = isim\n        # Her \u00f6rnek kendi ba\u011f\u0131ms\u0131z listesine sahip olur\n        self.etiketler = [] \n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131mla, her <code>GuvenliUrun<\/code> \u00f6rne\u011fi kendi <code>etiketler<\/code> listesine sahip olur ve bir \u00f6rne\u011fin etiketlerini de\u011fi\u015ftirmek di\u011ferlerini etkilemez. De\u011fi\u015ftirilebilir s\u0131n\u0131f de\u011fi\u015fkenlerinin bu tuza\u011f\u0131n\u0131 anlamak, daha sa\u011flam ve \u00f6ng\u00f6r\u00fclebilir Python kodlar\u0131 yazman\u0131z i\u00e7in hayati \u00f6nem ta\u015f\u0131r. Aksi takdirde, hata ay\u0131klama s\u00fcre\u00e7leri kabusa d\u00f6n\u00fc\u015febilir ve yaz\u0131l\u0131m\u0131n\u0131zda gizli yan etkiler olu\u015fabilir. Bu bilgi \u0131\u015f\u0131\u011f\u0131nda, ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu durumlarla nas\u0131l ba\u015fa \u00e7\u0131kaca\u011f\u0131m\u0131z\u0131 bir sonraki b\u00f6l\u00fcmde inceleyece\u011fiz.<\/p>\n<h2 id=\"gercek-dunya-senaryolari\">Bu Durumlarla Ger\u00e7ek D\u00fcnyada Nas\u0131l Kar\u015f\u0131la\u015f\u0131r\u0131z? Vaka Analizleri<\/h2>\n<p>Python s\u0131n\u0131f de\u011fi\u015fkenlerinin incelikleri, genellikle basit \u00f6rneklerde zarars\u0131z gibi g\u00f6r\u00fcnse de, ger\u00e7ek d\u00fcnya uygulamalar\u0131nda \u00f6nemli ve kafa kar\u0131\u015ft\u0131r\u0131c\u0131 sorunlara yol a\u00e7abilir. Bu b\u00f6l\u00fcmde, bu davran\u0131\u015flar\u0131n yayg\u0131n olarak kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131 baz\u0131 senaryolar\u0131 ve bunlar\u0131n nas\u0131l \u00e7\u00f6z\u00fclebilece\u011fini vaka analizleri ile ele alaca\u011f\u0131z.<\/p>\n<h3>Vaka 1: Varsay\u0131lan Ayarlar Sistemi<\/h3>\n<p>Bir\u00e7ok uygulamada, kullan\u0131c\u0131 veya sistem genelinde ge\u00e7erli olan varsay\u0131lan ayarlar\u0131 y\u00f6netmek i\u00e7in bir mekanizma bulunur. Geli\u015ftiriciler bazen bu varsay\u0131lan ayarlar\u0131 bir s\u0131n\u0131f de\u011fi\u015fkeni olarak tan\u0131mlama e\u011filimindedir. \u00d6rne\u011fin, bir web uygulamas\u0131n\u0131n g\u00fcvenlik ayarlar\u0131:<\/p>\n<pre><code>\nclass GuvenlikAyar:\n    # Varsay\u0131lan izinler: s\u0131n\u0131f de\u011fi\u015fkeni olarak mutable liste\n    izinler = [\"okuma\", \"yazma\"] \n    varsayilan_max_deneme = 3 # Immutable s\u0131n\u0131f de\u011fi\u015fkeni\n\n    def __init__(self, kullanici_adi):\n        self.kullanici_adi = kullanici_adi\n        # Her kullan\u0131c\u0131ya kendi izin listesini atamak yerine, \n        # s\u0131n\u0131f\u0131n izin listesine referans veriyor.\n        # self.izinler = GuvenlikAyar.izinler # Hata burada!\n\nkullanici1 = GuvenlikAyar(\"ali\")\nkullanici2 = GuvenlikAyar(\"veli\")\n\nprint(f\"Ali'nin izinleri: {kullanici1.izinler}\") # ['okuma', 'yazma']\nprint(f\"Veli'nin izinleri: {kullanici2.izinler}\") # ['okuma', 'yazma']\n\n# Ali'ye 'silme' izni ekleyelim\nkullanici1.izinler.append(\"silme\") \n\nprint(f\"Ali'nin izinleri (sonra): {kullanici1.izinler}\") # ['okuma', 'yazma', 'silme']\nprint(f\"Veli'nin izinleri (sonra): {kullanici2.izinler}\") # BEKLENMEYEN: ['okuma', 'yazma', 'silme']\nprint(f\"S\u0131n\u0131f\u0131n izinleri: {GuvenlikAyar.izinler}\") # ['okuma', 'yazma', 'silme']\n<\/pre>\n<p><\/code><\/p>\n<p>Bu senaryoda, <code>kullanici1.izinler.append(\"silme\")<\/code> i\u015flemi, <code>kullanici1<\/code>'in kendi \u00f6zel bir <code>izinler<\/code> listesi olmad\u0131\u011f\u0131 i\u00e7in do\u011frudan <code>GuvenlikAyar.izinler<\/code> s\u0131n\u0131f de\u011fi\u015fkeni listesine eleman ekler. Sonu\u00e7 olarak, <code>kullanici2<\/code> de bu de\u011fi\u015fikli\u011fi yans\u0131t\u0131r. Bu durum, g\u00fcvenlik katmanlar\u0131nda ciddi zafiyetlere veya hatal\u0131 yetkilendirmelere yol a\u00e7abilir. \u00c7\u00f6z\u00fcm, her \u00f6rne\u011fin kendi de\u011fi\u015ftirilebilir nitelik kopyas\u0131na sahip olmas\u0131n\u0131 sa\u011flamakt\u0131r:<\/p>\n<pre><code>\nclass GuvenliGuvenlikAyar:\n    varsayilan_max_deneme = 3\n\n    def __init__(self, kullanici_adi):\n        self.kullanici_adi = kullanici_adi\n        # Her \u00f6rnek i\u00e7in s\u0131n\u0131f de\u011fi\u015fkeninin yeni bir kopyas\u0131n\u0131 olu\u015ftur.\n        self.izinler = [\"okuma\", \"yazma\"] \n        # Alternatif olarak: self.izinler = list(GuvenliGuvenlikAyar.varsayilan_izinler)\n        # E\u011fer varsay\u0131lan izinler de bir s\u0131n\u0131f de\u011fi\u015fkeni olarak tan\u0131mlanm\u0131\u015f olsayd\u0131\n<\/pre>\n<p><\/code><\/p>\n<h3>Vaka 2: Envanter Y\u00f6netimi ve Ortak Kaynak Takibi<\/h3>\n<p>Bir e-ticaret uygulamas\u0131nda, bir \u00fcr\u00fcn\u00fcn farkl\u0131 varyasyonlar\u0131n\u0131n (beden, renk gibi) toplam stok say\u0131s\u0131n\u0131 takip etmek isteyebilirsiniz. Bazen genel bir \u00fcr\u00fcn kategorisinin mevcut t\u00fcm varyasyonlar\u0131n\u0131n toplam say\u0131s\u0131n\u0131 s\u0131n\u0131f de\u011fi\u015fkeni olarak tutmak mant\u0131kl\u0131 gibi g\u00f6r\u00fcnebilir:<\/p>\n<pre><code>\nclass UrunKatalog:\n    # Kategoriye ait t\u00fcm \u00fcr\u00fcnlerin takip listesi\n    tum_urun_kodlari = [] \n\n    def __init__(self, kod, ad):\n        self.kod = kod\n        self.ad = ad\n        UrunKatalog.tum_urun_kodlari.append(kod) # S\u0131n\u0131f de\u011fi\u015fkenini do\u011frudan de\u011fi\u015ftiriyoruz\n\ntelefon_katalog = UrunKatalog(\"TLFN001\", \"Ak\u0131ll\u0131 Telefon\")\ntablet_katalog = UrunKatalog(\"TBLT001\", \"Tablet\")\n\nprint(f\"T\u00fcm \u00fcr\u00fcn kodlar\u0131: {UrunKatalog.tum_urun_kodlari}\") # ['TLFN001', 'TBLT001']\n\n# \u015eimdi varsayal\u0131m ki bir \u00fcr\u00fcn i\u00e7in yeni bir kod listesi atamak istiyoruz\n# BURADA G\u00d6LGELEME MEYDANA GEL\u0130YOR\ntelefon_katalog.tum_urun_kodlari = [\"TLFN002\", \"TLFN003\"] \n\nprint(f\"Telefon katalog kodlar\u0131: {telefon_katalog.tum_urun_kodlari}\") # ['TLFN002', 'TLFN003']\nprint(f\"Tablet katalog kodlar\u0131: {tablet_katalog.tum_urun_kodlari}\") # Hala ['TLFN001', 'TBLT001']\nprint(f\"S\u0131n\u0131f\u0131n t\u00fcm \u00fcr\u00fcn kodlar\u0131: {UrunKatalog.tum_urun_kodlari}\") # Hala ['TLFN001', 'TBLT001']\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>telefon_katalog.tum_urun_kodlari = [...]<\/code> ifadesi, <code>telefon_katalog<\/code> nesnesi i\u00e7in yeni bir \u00f6rnek de\u011fi\u015fkeni olu\u015fturdu ve s\u0131n\u0131f de\u011fi\u015fkenini g\u00f6lgeledi. E\u011fer ama\u00e7, bir katalo\u011fun kendi i\u00e7inde ba\u011f\u0131ms\u0131z bir kod listesi tutmas\u0131 idiyse, <code>tum_urun_kodlari<\/code> bir s\u0131n\u0131f de\u011fi\u015fkeni olmamal\u0131, her \u00f6rne\u011fin kendi <code>__init__<\/code> metodunda tan\u0131mlanan bir \u00f6rnek de\u011fi\u015fkeni olmal\u0131yd\u0131. E\u011fer ama\u00e7, t\u00fcm \u00fcr\u00fcn kodlar\u0131n\u0131n tek bir merkezde takip edilmesi ve her \u00f6rnekten eri\u015filebilmesi ise, o zaman s\u0131n\u0131f de\u011fi\u015fkenini do\u011frudan <code>UrunKatalog.tum_urun_kodlari<\/code> \u015feklinde kullanmak veya bir s\u0131n\u0131f metodu (<code>@classmethod<\/code>) ile eri\u015fim ve de\u011fi\u015fiklik yapmak daha do\u011fru olurdu.<\/p>\n<h3>Vaka 3: Veritaban\u0131 Ba\u011flant\u0131 Havuzu Y\u00f6netimi<\/h3>\n<p>Performans optimizasyonu i\u00e7in veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 bir havuzda tutmak yayg\u0131n bir yakla\u015f\u0131md\u0131r. Bu havuz genellikle uygulaman\u0131n genelinde tekil (singleton) bir kaynak olarak i\u015flev g\u00f6r\u00fcr. Bu durumda, havuzun bir s\u0131n\u0131f de\u011fi\u015fkeni olarak tan\u0131mlanmas\u0131 mant\u0131kl\u0131 g\u00f6r\u00fcn\u00fcr:<\/p>\n<pre><code>\n# Bu \u00f6rnek, ger\u00e7ek bir DB ba\u011flant\u0131s\u0131 kurmayacak, sadece mant\u0131\u011f\u0131 g\u00f6sterecek.\nclass DbBaglantiHavuzu:\n    _havuz = [] # S\u0131n\u0131f de\u011fi\u015fkeni: Mutlak liste\n    MAX_BAGLANTI = 5\n\n    @classmethod\n    def baglanti_al(cls):\n        if len(cls._havuz) < cls.MAX_BAGLANTI:\n            # Ger\u00e7ekte burada bir ba\u011flant\u0131 olu\u015fturulur\n            yeni_baglanti = f\"Baglanti_{len(cls._havuz) + 1}\"\n            cls._havuz.append(yeni_baglanti)\n            print(f\"Yeni ba\u011flant\u0131 eklendi: {yeni_baglanti}\")\n            return yeni_baglanti\n        else:\n            print(\"Havuz dolu, ba\u011flant\u0131 verilemiyor.\")\n            return None\n\n    @classmethod\n    def baglanti_birak(cls, baglanti):\n        if baglanti in cls._havuz:\n            cls._havuz.remove(baglanti)\n            print(f\"Ba\u011flant\u0131 b\u0131rak\u0131ld\u0131: {baglanti}\")\n        else:\n            print(f\"Ba\u011flant\u0131 havuzda bulunamad\u0131: {baglanti}\")\n\n    @classmethod\n    def havuzu_goster(cls):\n        return cls._havuz\n\n# Kullan\u0131m\nbaglanti1 = DbBaglantiHavuzu.baglanti_al()\nbaglanti2 = DbBaglantiHavuzu.baglanti_al()\nprint(f\"Mevcut havuz: {DbBaglantiHavuzu.havuzu_goster()}\")\n\n# Bu durumda s\u0131n\u0131f de\u011fi\u015fkenini do\u011frudan s\u0131n\u0131f metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla manip\u00fcle etmek do\u011fru bir yakla\u015f\u0131md\u0131r.\n# \u00c7\u00fcnk\u00fc _havuz, t\u00fcm uygulaman\u0131n ortak bir kayna\u011f\u0131d\u0131r ve her bir DB istemcisinin kendine ait\n# bir havuz kopyas\u0131 olmas\u0131n\u0131 istemeyiz. Burada mutable s\u0131n\u0131f de\u011fi\u015fkeni bilerek ve kontroll\u00fc kullan\u0131l\u0131yor.\n<\/pre>\n<p><\/code><\/p>\n<p>Bu vaka analizinde, <code>_havuz<\/code> listesi bir s\u0131n\u0131f de\u011fi\u015fkeni olarak tan\u0131mlanm\u0131\u015ft\u0131r ve t\u00fcm ba\u011flant\u0131 havuzu operasyonlar\u0131 (<code>baglanti_al<\/code>, <code>baglanti_birak<\/code>) s\u0131n\u0131f metotlar\u0131 (<code>@classmethod<\/code>) arac\u0131l\u0131\u011f\u0131yla bu s\u0131n\u0131f de\u011fi\u015fkenini manip\u00fcle eder. Bu, s\u0131n\u0131f de\u011fi\u015fkenlerinin do\u011fru ve kontroll\u00fc bir \u015fekilde, ortak bir kaynak olarak kullan\u0131ld\u0131\u011f\u0131 bir \u00f6rnektir. \u00d6nemli olan, mutable s\u0131n\u0131f de\u011fi\u015fkenlerinin ne zaman ve neden kullan\u0131ld\u0131\u011f\u0131n\u0131 tam olarak anlamakt\u0131r. E\u011fer bir de\u011fi\u015fkene her zaman s\u0131n\u0131f \u00fczerinden eri\u015fip de\u011fi\u015ftirecekseniz ve bu de\u011fi\u015fikli\u011fin t\u00fcm \u00f6rnekler \u00fczerinde etkili olmas\u0131n\u0131 istiyorsan\u0131z, mutable s\u0131n\u0131f de\u011fi\u015fkenleri uygun olabilir. Aksi takdirde, her \u00f6rnek i\u00e7in ba\u011f\u0131ms\u0131z kopyalar olu\u015fturmak daha g\u00fcvenlidir.<\/p>\n<div class=\"expert-tip\">\n  <strong>Uzman \u0130pucu:<\/strong> Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, karma\u015f\u0131kl\u0131\u011f\u0131 azaltmak i\u00e7in genellikle s\u0131n\u0131f de\u011fi\u015fkenleri i\u00e7in immutable tipleri tercih etmek veya mutable tipleri kullan\u0131rken <code>@classmethod<\/code> gibi kontroll\u00fc eri\u015fim noktalar\u0131 sa\u011flamak en iyi uygulamalardan biridir. Bu, kodunuzun bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve gizemli hatalar\u0131n \u00f6n\u00fcne ge\u00e7er.\n<\/div>\n<p>Bu vaka analizleri, s\u0131n\u0131f de\u011fi\u015fkenlerinin do\u011fru kullan\u0131m\u0131yla ilgili pratik bilgiler sunmaktad\u0131r. Her senaryo, bu de\u011fi\u015fkenlerin do\u011fas\u0131n\u0131 ve beklentilerimizle nas\u0131l \u00e7eli\u015febileceklerini vurgular. Bu bilgiyi i\u00e7selle\u015ftirerek, daha sa\u011flam ve hatas\u0131z Python uygulamalar\u0131 geli\u015ftirebilirsiniz.<\/p>\n<h2 id=\"dogru-kullanim\">S\u0131n\u0131f De\u011fi\u015fkenlerini Do\u011fru Kullanman\u0131n Yollar\u0131 Nelerdir?<\/h2>\n<p>Art\u0131k Python s\u0131n\u0131f de\u011fi\u015fkenlerinin nas\u0131l davrand\u0131\u011f\u0131n\u0131 ve neden bazen kafa kar\u0131\u015f\u0131kl\u0131\u011f\u0131na yol a\u00e7t\u0131\u011f\u0131n\u0131 biliyoruz. \u00d6nemli olan, bu bilgiyi kullanarak kodlar\u0131m\u0131z\u0131 daha sa\u011flam ve \u00f6ng\u00f6r\u00fclebilir hale getirmektir. Peki, s\u0131n\u0131f de\u011fi\u015fkenlerini ne zaman ve nas\u0131l do\u011fru bir \u015fekilde kullanabiliriz?<\/p>\n<h3>Ne Zaman S\u0131n\u0131f De\u011fi\u015fkenleri Kullanmal\u0131y\u0131z?<\/h3>\n<p>S\u0131n\u0131f de\u011fi\u015fkenleri, belirli senaryolarda son derece faydal\u0131 olabilir:<\/p>\n<ol>\n<li>\n        <strong>Sabitler (Constants):<\/strong> Bir s\u0131n\u0131f\u0131n veya uygulaman\u0131n genelinde de\u011fi\u015fmemesi gereken de\u011ferler i\u00e7in idealdir. \u00d6rne\u011fin, bir oyun s\u0131n\u0131f\u0131ndaki maksimum can de\u011feri veya bir matematiksel sabit (pi say\u0131s\u0131). Bu t\u00fcr de\u011ferler genellikle de\u011fi\u015ftirilemez (immutable) veri tipleridir.<\/p>\n<pre><code>\nclass OyunAyarlari:\n    MAX_CAN = 100\n    OYUN_MODU = \"NORMAL\"\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Ortak Kaynaklar veya Yap\u0131land\u0131rmalar:<\/strong> T\u00fcm \u00f6rneklerin payla\u015fmas\u0131 gereken bir veritaban\u0131 ba\u011flant\u0131 havuzu, bir \u00f6nbellek (cache) veya bir loglama nesnesi gibi ortak kaynaklar\u0131n referanslar\u0131n\u0131 tutmak i\u00e7in kullan\u0131labilirler. Bu durumda, genellikle bu kayna\u011f\u0131 y\u00f6neten s\u0131n\u0131f metotlar\u0131 (<code>@classmethod<\/code>) ile birlikte kullan\u0131l\u0131rlar.<\/p>\n<pre><code>\nclass VeritabaniBaglayici:\n    _baglanti = None # Ortak ba\u011flant\u0131 referans\u0131\n\n    @classmethod\n    def baglantiyi_al(cls):\n        if cls._baglanti is None:\n            print(\"Yeni veritaban\u0131 ba\u011flant\u0131s\u0131 olu\u015fturuluyor...\")\n            cls._baglanti = \"Sim\u00fcle Edilmi\u015f DB Ba\u011flant\u0131s\u0131\"\n        return cls._baglanti\n\n# Herhangi bir yerden eri\u015fim\ndb1 = VeritabaniBaglayici.baglantiyi_al()\ndb2 = VeritabaniBaglayici.baglantiyi_al()\nprint(f\"Db1: {db1}, Db2: {db2}\") # \u0130kisi de ayn\u0131 referansa sahip olacak\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Saya\u00e7lar:<\/strong> Bir s\u0131n\u0131ftan ka\u00e7 tane \u00f6rnek olu\u015fturuldu\u011funu takip etmek gibi basit saya\u00e7lar i\u00e7in kullan\u0131labilirler.<\/p>\n<pre><code>\nclass Kullanici:\n    kullanici_sayisi = 0\n\n    def __init__(self, ad):\n        self.ad = ad\n        Kullanici.kullanici_sayisi += 1\n\nk1 = Kullanici(\"Ay\u015fe\")\nk2 = Kullanici(\"Fatma\")\nprint(f\"Toplam kullan\u0131c\u0131: {Kullanici.kullanici_sayisi}\") # 2\n        <\/pre>\n<p><\/code>\n    <\/li>\n<\/ol>\n<h3>Ne Zaman \u00d6rnek De\u011fi\u015fkenleri Kullanmal\u0131y\u0131z?<\/h3>\n<p>Her bir nesnenin kendi ba\u011f\u0131ms\u0131z durumuna sahip olmas\u0131 gereken t\u00fcm durumlar i\u00e7in \u00f6rnek de\u011fi\u015fkenleri kullanmal\u0131s\u0131n\u0131z. Bir nesnenin benzersiz \u00f6zelliklerini (ad\u0131, ya\u015f\u0131, rengi vb.) tan\u0131mlayan de\u011fi\u015fkenler her zaman \u00f6rnek de\u011fi\u015fkenleri olmal\u0131d\u0131r. Bu, genellikle <code>__init__<\/code> metodunun i\u00e7inde <code>self.degisken = deger<\/code> \u015feklinde yap\u0131l\u0131r.<\/p>\n<h3>Tuzaklardan Ka\u00e7\u0131nma Teknikleri ve En \u0130yi Uygulamalar<\/h3>\n<p>S\u0131n\u0131f de\u011fi\u015fkenlerinin neden oldu\u011fu potansiyel sorunlardan ka\u00e7\u0131nmak i\u00e7in a\u015fa\u011f\u0131daki teknikleri ve en iyi uygulamalar\u0131 kullanabilirsiniz:<\/p>\n<ol>\n<li>\n        <strong>De\u011fi\u015ftirilebilir S\u0131n\u0131f De\u011fi\u015fkenlerinden Ka\u00e7\u0131n\u0131n (Genellikle):<\/strong> De\u011fi\u015ftirilebilir (mutable) veri tiplerini (liste, s\u00f6zl\u00fck, set gibi) s\u0131n\u0131f de\u011fi\u015fkeni olarak kullanmaktan genellikle ka\u00e7\u0131n\u0131n. E\u011fer mutlaka kullanman\u0131z gerekiyorsa, bunun t\u00fcm \u00f6rnekler i\u00e7in ortak bir kaynak oldu\u011funu ve her \u00f6rne\u011fin bu kayna\u011f\u0131 de\u011fi\u015ftirebilece\u011fini unutmay\u0131n. Bu durumu bilin\u00e7li olarak y\u00f6netin.\n    <\/li>\n<li>\n        <strong><code>__init__<\/code> Metodunda Kopyalama:<\/strong> E\u011fer bir s\u0131n\u0131f\u0131n varsay\u0131lan de\u011fi\u015ftirilebilir bir de\u011fi\u015fkenini her \u00f6rne\u011fin kendi ba\u011f\u0131ms\u0131z kopyas\u0131 olarak kullanmas\u0131n\u0131 istiyorsan\u0131z, bu kopyalamay\u0131 <code>__init__<\/code> metodunda yap\u0131n:<\/p>\n<pre><code>\nclass Rapor:\n    varsayilan_basliklar = [\"ID\", \"Ad\", \"Soyad\"] # Bu bir s\u0131n\u0131f de\u011fi\u015fkeni (mutable)\n\n    def __init__(self, ad):\n        self.ad = ad\n        # \u00d6rnek i\u00e7in s\u0131n\u0131f de\u011fi\u015fkeninin yeni bir kopyas\u0131n\u0131 olu\u015ftur.\n        self.rapor_basliklari = list(Rapor.varsayilan_basliklar) \n        # Veya basit\u00e7e: self.rapor_basliklari = [\"ID\", \"Ad\", \"Soyad\"]\n        <\/pre>\n<p><\/code><\/p>\n<p>E\u011fer i\u00e7 i\u00e7e ge\u00e7mi\u015f de\u011fi\u015ftirilebilir nesneler varsa, <code>copy.deepcopy()<\/code> kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<\/li>\n<li>\n        <strong>Do\u011frudan S\u0131n\u0131f \u00dczerinden Eri\u015fim:<\/strong> Bir s\u0131n\u0131f de\u011fi\u015fkenini de\u011fi\u015ftirmek veya ona eri\u015fmek istedi\u011finizde, bunu do\u011frudan s\u0131n\u0131f ad\u0131 \u00fczerinden yap\u0131n (<code>ClassName.variable<\/code>). Bu, bir \u00f6rnek de\u011fi\u015fkeni olu\u015fturup s\u0131n\u0131f de\u011fi\u015fkenini g\u00f6lgeleme riskini ortadan kald\u0131r\u0131r.<\/p>\n<pre><code>\nAyar.varsayilan_dil = \"Almanca\" # S\u0131n\u0131f de\u011fi\u015fkenini do\u011frudan de\u011fi\u015ftirme\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong><code>@classmethod<\/code> Kullan\u0131m\u0131:<\/strong> E\u011fer s\u0131n\u0131f de\u011fi\u015fkenlerini manip\u00fcle eden bir mant\u0131k varsa, bunu bir s\u0131n\u0131f metodu (<code>@classmethod<\/code>) i\u00e7ine almak en iyi uygulamad\u0131r. Bu, s\u0131n\u0131f de\u011fi\u015fkenlerine kontroll\u00fc ve merkezi bir eri\u015fim sa\u011flar.<\/p>\n<pre><code>\nclass AyarYoneticisi:\n    _ayarlar = {} # Ortak ayarlar s\u00f6zl\u00fc\u011f\u00fc\n\n    @classmethod\n    def ayar_getir(cls, anahtar):\n        return cls._ayarlar.get(anahtar)\n\n    @classmethod\n    def ayar_kaydet(cls, anahtar, deger):\n        cls._ayarlar[anahtar] = deger\n\n# Kullan\u0131m:\nAyarYoneticisi.ayar_kaydet(\"veritabani_adi\", \"prod_db\")\nprint(AyarYoneticisi.ayar_getir(\"veritabani_adi\")) # prod_db\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Adland\u0131rma Kurallar\u0131:<\/strong> S\u0131n\u0131f de\u011fi\u015fkenleri i\u00e7in adland\u0131rma kurallar\u0131 benimsemek, kodun okunabilirli\u011fini art\u0131rabilir. \u00d6rne\u011fin, sabitler i\u00e7in t\u00fcm\u00fc b\u00fcy\u00fck harf kullanmak (<code>MAX_CAN<\/code>) veya dahili s\u0131n\u0131f de\u011fi\u015fkenleri i\u00e7in tek alt \u00e7izgi ile ba\u015flamak (<code>_baglanti<\/code>) gibi.\n    <\/li>\n<\/ol>\n<p>Bu k\u0131lavuzlar\u0131 takip ederek, Python s\u0131n\u0131f de\u011fi\u015fkenlerinin g\u00fcc\u00fcnden faydalan\u0131rken ayn\u0131 zamanda olas\u0131 tuzaklardan da uzak durabilirsiniz. Bu, kodunuzun daha g\u00fcvenilir, anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flayacakt\u0131r. Unutmay\u0131n, Python'da \"a\u00e7\u0131k olan \u00f6rt\u00fcl\u00fc olandan iyidir\" ilkesi her zaman ge\u00e7erlidir.<\/p>\n<h3 id=\"mobil-uyumlu-arayuzler\">Mobil Uyumlu Aray\u00fczlerde Python S\u0131n\u0131f De\u011fi\u015fkenlerinin Rol\u00fc (\u00d6rnekle)<\/h3>\n<p>Konumuz her ne kadar Python s\u0131n\u0131f de\u011fi\u015fkenlerinin davran\u0131\u015flar\u0131 olsa da, modern yaz\u0131l\u0131m geli\u015ftirmede front-end (\u00f6n y\u00fcz) ve back-end (arka y\u00fcz) aras\u0131ndaki etkile\u015fim s\u0131k\u00e7a kar\u015f\u0131m\u0131za \u00e7\u0131kar. Python genellikle sunucu taraf\u0131nda (back-end) \u00e7al\u0131\u015f\u0131rken, kullan\u0131c\u0131 aray\u00fczleri (front-end) HTML, CSS ve JavaScript ile olu\u015fturulur. Ancak, Python s\u0131n\u0131f de\u011fi\u015fkenleri, bu front-end kararlar\u0131n\u0131 etkileyen yap\u0131land\u0131rma veya i\u015f mant\u0131\u011f\u0131n\u0131 merkezi bir \u015fekilde y\u00f6netmede dolayl\u0131 bir rol oynayabilir. \u00d6rne\u011fin, bir web uygulamas\u0131n\u0131n farkl\u0131 cihaz t\u00fcrlerine (mobil, tablet, masa\u00fcst\u00fc) g\u00f6re sundu\u011fu \u00f6zellikleri veya tasar\u0131m \u00f6\u011felerini belirleyen parametreleri Python s\u0131n\u0131f de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netebiliriz.<\/p>\n<p>\u015e\u00f6yle bir senaryo d\u00fc\u015f\u00fcnelim: Bir e-ticaret sitesi, \u00fcr\u00fcn listeleme sayfas\u0131nda mobil cihazlarda daha az \u00fcr\u00fcn g\u00f6stermek, tabletlerde orta say\u0131da, masa\u00fcst\u00fcnde ise tam \u00fcr\u00fcn listesini sunmak istiyor. Bu limitler, Python back-end'inde bir s\u0131n\u0131f de\u011fi\u015fkeni olarak tan\u0131mlanabilir ve front-end'e API arac\u0131l\u0131\u011f\u0131yla iletilebilir.<\/p>\n<pre><code>\nclass Ayarlar:\n    # S\u0131n\u0131f de\u011fi\u015fkenleri: Farkl\u0131 cihaz t\u00fcrleri i\u00e7in varsay\u0131lan \u00fcr\u00fcn limiti\n    MOBIL_URUN_LIMITI = 5\n    TABLET_URUN_LIMITI = 10\n    DESKTOP_URUN_LIMITI = 20\n    \n    # Varsay\u0131lan tema (\u00f6rne\u011fin, a\u00e7\u0131k\/koyu)\n    VARSAYILAN_TEMA = \"light\"\n\n    @classmethod\n    def get_urun_limit(cls, cihaz_tipi):\n        if cihaz_tipi == \"mobil\":\n            return cls.MOBIL_URUN_LIMITI\n        elif cihaz_tipi == \"tablet\":\n            return cls.TABLET_URUN_LIMITI\n        else: # Varsay\u0131lan olarak masa\u00fcst\u00fc\n            return cls.DESKTOP_URUN_LIMITI\n\n# \u00d6rne\u011fin, bir API endpoint'i bu bilgiyi d\u00f6nd\u00fcrebilir:\n# def get_frontend_config(request):\n#     cihaz_tipi = request.headers.get(\"X-Device-Type\", \"desktop\")\n#     return {\"urun_limiti\": Ayarlar.get_urun_limit(cihaz_tipi), \n#             \"tema\": Ayarlar.VARSAYILAN_TEMA}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki Python s\u0131n\u0131f\u0131, farkl\u0131 cihaz tipleri i\u00e7in \u00fcr\u00fcn limitlerini ve varsay\u0131lan temay\u0131 s\u0131n\u0131f de\u011fi\u015fkenleri olarak tutar. Bir front-end uygulamas\u0131, bu API'yi \u00e7a\u011f\u0131rarak ilgili limitleri alabilir. Front-end'de ise, bu limitler ve tema bilgileri kullan\u0131larak aray\u00fcz dinamik olarak olu\u015fturulabilir. Mobil uyumlu tasar\u0131m\u0131n temelini olu\u015fturan CSS Media Query'ler ise, bu Python back-end mant\u0131\u011f\u0131yla birlikte \u00e7al\u0131\u015farak g\u00f6rsel adaptasyonu sa\u011flar. \u00d6rne\u011fin, front-end, Python'dan ald\u0131\u011f\u0131 \u00fcr\u00fcn limitine g\u00f6re bir d\u00f6ng\u00fc kurar ve CSS de ekran boyutuna g\u00f6re farkl\u0131 stiller uygular. \u0130\u015fte basit bir CSS Media Query \u00f6rne\u011fi:<\/p>\n<pre><code>\n\/* style.css *\/\n.urun-liste {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr); \/* Masa\u00fcst\u00fcnde 4 s\u00fctun *\/\n  gap: 20px;\n}\n\n\/* Tablet cihazlar i\u00e7in *\/\n@media (max-width: 992px) {\n  .urun-liste {\n    grid-template-columns: repeat(2, 1fr); \/* Tablette 2 s\u00fctun *\/\n  }\n}\n\n\/* Mobil cihazlar i\u00e7in *\/\n@media (max-width: 576px) {\n  .urun-liste {\n    grid-template-columns: repeat(1, 1fr); \/* Mobilde 1 s\u00fctun *\/\n  }\n  .urun-liste-item {\n    padding: 10px;\n  }\n}\n\n\/* Python'dan gelen tema ayar\u0131na g\u00f6re stil *\/\nbody.dark-theme {\n  background-color: #333;\n  color: #eee;\n}\n\nbody.light-theme {\n  background-color: #fff;\n  color: #333;\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu CSS kodunda, <code>@media<\/code> kurallar\u0131 ekran geni\u015fli\u011fine g\u00f6re farkl\u0131 stil kurallar\u0131n\u0131 tetikler. \u00d6rne\u011fin, mobil cihazlarda (ekran geni\u015fli\u011fi 576 pikselden k\u00fc\u00e7\u00fck oldu\u011funda) \u00fcr\u00fcn listesi tek s\u00fctun halinde g\u00f6sterilir. Python s\u0131n\u0131f de\u011fi\u015fkenleri ise, g\u00f6sterilecek \u00fcr\u00fcn say\u0131s\u0131n\u0131 belirleyerek (<code>MOBIL_URUN_LIMITI<\/code> gibi) ve tema bilgisini (<code>VARSAYILAN_TEMA<\/code>) sa\u011flayarak, front-end'in sadece g\u00f6rsel adaptasyonunu de\u011fil, ayn\u0131 zamanda i\u00e7erik sunumunu da \u015fekillendirmesine yard\u0131mc\u0131 olur. Bu, Python back-end'inin global ayarlar\u0131 merkezi bir \u015fekilde y\u00f6neterek, front-end'in daha ak\u0131ll\u0131 ve cihazlara duyarl\u0131 davran\u0131\u015flar sergilemesine olanak tan\u0131d\u0131\u011f\u0131 bir \u00f6rnektir. Dolay\u0131s\u0131yla, Python s\u0131n\u0131f de\u011fi\u015fkenleri do\u011frudan HTML veya CSS \u00fcretmese de, bu t\u00fcr dinamik ve mobil uyumlu aray\u00fczlerin arkas\u0131ndaki stratejik kararlar\u0131n ve yap\u0131land\u0131rmalar\u0131n temelini olu\u015fturabilirler.<\/p>\n<h2 id=\"ileri-duzey\">\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve P\u00fcf Noktalar\u0131: __slots__ ve @property Kullan\u0131m\u0131<\/h2>\n<p>Python s\u0131n\u0131f de\u011fi\u015fkenlerinin temel ve orta d\u00fczey kullan\u0131mlar\u0131n\u0131 ve tuzaklar\u0131n\u0131 ele ald\u0131ktan sonra, \u015fimdi daha deneyimli geli\u015ftiriciler i\u00e7in performans optimizasyonu ve nitelik kontrol\u00fc sa\u011flayan baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131na g\u00f6z atal\u0131m: <code>__slots__<\/code> ve <code>@property<\/code> kullan\u0131m\u0131.<\/p>\n<h3>__slots__ ile Bellek Optimizasyonu ve Nitelik Kontrol\u00fc<\/h3>\n<p>Normalde, Python'daki her nesnenin bir <code>__dict__<\/code> niteli\u011fi bulunur. Bu s\u00f6zl\u00fck, nesnenin \u00f6rnek de\u011fi\u015fkenlerini (veya niteliklerini) dinamik olarak depolamak i\u00e7in kullan\u0131l\u0131r. Bu esnekli\u011fi sa\u011flar ancak ek bellek t\u00fcketimine ve biraz daha yava\u015f eri\u015fim s\u00fcrelerine neden olabilir. \u00d6zellikle \u00e7ok say\u0131da k\u00fc\u00e7\u00fck nesne \u00f6rne\u011fi olu\u015fturuyorsan\u0131z, bu durum performans\u0131 etkileyebilir.<\/p>\n<p><code>__slots__<\/code>, bir s\u0131n\u0131f\u0131n \u00f6rneklerinin sabit bir nitelik k\u00fcmesine sahip olaca\u011f\u0131n\u0131 Python'a bildiren bir s\u0131n\u0131f de\u011fi\u015fkenidir. Bu liste, bir nesnenin sahip olabilece\u011fi t\u00fcm ge\u00e7erli nitelik adlar\u0131n\u0131 i\u00e7erir. <code>__slots__<\/code> kullan\u0131ld\u0131\u011f\u0131nda:<\/p>\n<ol>\n<li>\n        <strong>Bellek T\u00fcketimi Azal\u0131r:<\/strong> <code>__dict__<\/code> s\u00f6zl\u00fc\u011f\u00fc ortadan kalkt\u0131\u011f\u0131 i\u00e7in, her nesne i\u00e7in ayr\u0131lan bellek miktar\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azal\u0131r.\n    <\/li>\n<li>\n        <strong>Daha H\u0131zl\u0131 Nitelik Eri\u015fimi:<\/strong> Niteliklere eri\u015fim, s\u00f6zl\u00fck aramas\u0131 yerine do\u011frudan ofsetler \u00fczerinden yap\u0131ld\u0131\u011f\u0131 i\u00e7in daha h\u0131zl\u0131 hale gelebilir.\n    <\/li>\n<li>\n        <strong>Yeni Nitelik Olu\u015fturma Engellenir:<\/strong> S\u0131n\u0131f\u0131n tan\u0131m\u0131nda belirtilen <code>__slots__<\/code> listesinde olmayan yeni bir niteli\u011fi bir \u00f6rne\u011fe dinamik olarak atamaya \u00e7al\u0131\u015f\u0131rsan\u0131z, <code>AttributeError<\/code> hatas\u0131 al\u0131rs\u0131n\u0131z. Bu, kodunuzu daha \u00f6ng\u00f6r\u00fclebilir hale getirir ve yaz\u0131m hatalar\u0131n\u0131 \u00f6nleyebilir.\n    <\/li>\n<\/ol>\n<pre><code>\nclass HafifNesne:\n    __slots__ = ['x', 'y'] # Sadece bu niteliklere sahip olabilir\n\n    def __init__(self, x, y):\n        self.x = x\n        self.y = y\n\nnesne1 = HafifNesne(10, 20)\nprint(nesne1.x) # 10\n\ntry:\n    nesne1.z = 30 # AttributeError y\u00fckseltir \u00e7\u00fcnk\u00fc 'z' __slots__'ta yok\nexcept AttributeError as e:\n    print(f\"Hata: {e}\")\n\n# nesne1.__dict__ mevcut de\u011fildir\n# print(nesne1.__dict__) # AttributeError: 'HafifNesne' object has no attribute '__dict__'\n<\/pre>\n<p><\/code><\/p>\n<p><code>__slots__<\/code> kullan\u0131rken dikkat edilmesi gerekenler: Miras alma, <code>__weakref__<\/code> deste\u011fi ve \u00e7oklu kal\u0131t\u0131m gibi durumlar karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131rabilir. Genellikle, basit veri ta\u015f\u0131y\u0131c\u0131 s\u0131n\u0131flar (DTO'lar) i\u00e7in veya bellek kritik uygulamalarda performans art\u0131\u015f\u0131 sa\u011flamak amac\u0131yla tercih edilir.<\/p>\n<h3>@property ile Kontroll\u00fc Nitelik Eri\u015fimi<\/h3>\n<p><code>@property<\/code> dekorat\u00f6r\u00fc, Python'da nesne niteliklerine eri\u015fimi, atamay\u0131 ve silmeyi \"Pythonik\" bir yolla kontrol etmenizi sa\u011flar. Bu, do\u011frudan niteliklere eri\u015fmek yerine metotlar arac\u0131l\u0131\u011f\u0131yla (getter, setter, deleter) eri\u015fimi kaps\u00fcllemenize olanak tan\u0131r, ancak bu metotlar\u0131 nitelik gibi kullanman\u0131z\u0131 sa\u011flar. Bu, niteliklerinize i\u015f mant\u0131\u011f\u0131 ekleyebilece\u011finiz anlam\u0131na gelir (\u00f6rne\u011fin, do\u011frulama, formatlama veya ba\u011f\u0131ml\u0131l\u0131klar\u0131 g\u00fcncelleme).<\/p>\n<pre><code>\nclass Dikdortgen:\n    def __init__(self, genislik, yukseklik):\n        self._genislik = genislik # \u00d6zel nitelik, do\u011frudan eri\u015fim istenmez\n        self._yukseklik = yukseklik\n\n    @property\n    def genislik(self):\n        \"\"\"Dikd\u00f6rtgenin geni\u015fli\u011fini d\u00f6nd\u00fcr\u00fcr.\"\"\"\n        print(\"Geni\u015flik okunuyor...\")\n        return self._genislik\n\n    @genislik.setter\n    def genislik(self, deger):\n        \"\"\"Geni\u015flik de\u011ferini ayarlar, negatif de\u011ferleri engeller.\"\"\"\n        print(\"Geni\u015flik ayarlan\u0131yor...\")\n        if deger < 0:\n            raise ValueError(\"Geni\u015flik negatif olamaz!\")\n        self._genislik = deger\n\n    @property\n    def yukseklik(self):\n        \"\"\"Dikd\u00f6rtgenin y\u00fcksekli\u011fini d\u00f6nd\u00fcr\u00fcr.\"\"\"\n        print(\"Y\u00fckseklik okunuyor...\")\n        return self._yukseklik\n    \n    @yukseklik.setter\n    def yukseklik(self, deger):\n        \"\"\"Y\u00fckseklik de\u011ferini ayarlar, negatif de\u011ferleri engeller.\"\"\"\n        print(\"Y\u00fckseklik ayarlan\u0131yor...\")\n        if deger < 0:\n            raise ValueError(\"Y\u00fckseklik negatif olamaz!\")\n        self._yukseklik = deger\n\n    @property\n    def alan(self):\n        \"\"\"Dikd\u00f6rtgenin alan\u0131n\u0131 hesaplar ve d\u00f6nd\u00fcr\u00fcr.\"\"\"\n        return self.genislik * self.yukseklik # Getter'lar \u00fczerinden eri\u015fim\n\nd = Dikdortgen(5, 10)\nprint(f\"Geni\u015flik: {d.genislik}\") # genislik getter'\u0131 \u00e7a\u011fr\u0131l\u0131r\nd.genislik = 7 # genislik setter'\u0131 \u00e7a\u011fr\u0131l\u0131r\nprint(f\"Yeni Geni\u015flik: {d.genislik}\")\nprint(f\"Alan: {d.alan}\") # alan property'si \u00e7a\u011fr\u0131l\u0131r (getter'lar\u0131 kullan\u0131r)\n\ntry:\n    d.yukseklik = -5 # ValueError y\u00fckseltir\nexcept ValueError as e:\n    print(f\"Hata: {e}\")\n<\/pre>\n<p><\/code><\/p>\n<p><code>@property<\/code> ile, <code>_genislik<\/code> gibi \u00f6zel nitelikleri gizleyip, onlara kontroll\u00fc bir aray\u00fcz (<code>genislik<\/code>) sunabilirsiniz. Bu, s\u0131n\u0131f\u0131n i\u00e7 yap\u0131s\u0131n\u0131 d\u0131\u015f d\u00fcnyaya if\u015fa etmeden veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flaman\u0131n zarif bir yoludur. Bir niteli\u011fin ba\u015flang\u0131\u00e7ta basit bir de\u011fi\u015fken olarak ba\u015flay\u0131p daha sonra ona do\u011frulama veya hesaplama mant\u0131\u011f\u0131 eklenmesi gerekti\u011finde, mevcut kodu de\u011fi\u015ftirmeden <code>@property<\/code> kullanarak bu ge\u00e7i\u015fi kolayca yapabilirsiniz.<\/p>\n<div class=\"expert-tip\">\n  <strong>Uzman \u0130pucu:<\/strong> S\u0131n\u0131f de\u011fi\u015fkenleri ve \u00f6rnek de\u011fi\u015fkenlerinin karma\u015f\u0131kl\u0131\u011f\u0131, bazen Python'\u0131n dinamik do\u011fas\u0131ndan kaynaklan\u0131r. <code>__slots__<\/code> ile belle\u011fi optimize ederken, <code>@property<\/code> ile de niteliklerin eri\u015fimini ve manip\u00fclasyonunu daha g\u00fcvenli ve mant\u0131kl\u0131 hale getirebilirsiniz. Bu ileri d\u00fczey teknikler, \u00f6zellikle b\u00fcy\u00fck ve performans-kritik uygulamalarda kod kalitesini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.\n<\/div>\n<p>Bu ileri d\u00fczey teknikleri anlamak ve do\u011fru yerlerde uygulamak, Python'da nesne y\u00f6nelimli tasar\u0131m yeteneklerinizi bir \u00fcst seviyeye ta\u015f\u0131yacakt\u0131r. Her zaman oldu\u011fu gibi, \"do\u011fru arac\u0131 do\u011fru i\u015f i\u00e7in kullanmak\" prensibini g\u00f6z \u00f6n\u00fcnde bulundurarak se\u00e7imlerinizi yapmal\u0131s\u0131n\u0131z.<\/p>\n<h2 id=\"sonuc\">Sonu\u00e7: Python S\u0131n\u0131f De\u011fi\u015fkenlerinde Ustala\u015fmak \u0130\u00e7in \u00d6nemli \u00c7\u0131kar\u0131mlar<\/h2>\n<p>Bu makale boyunca, Python s\u0131n\u0131f de\u011fi\u015fkenlerinin karma\u015f\u0131k d\u00fcnyas\u0131n\u0131, temel tan\u0131mlamalar\u0131ndan ba\u015flayarak ger\u00e7ek d\u00fcnya senaryolar\u0131na ve ileri d\u00fczey optimizasyon tekniklerine kadar detayl\u0131 bir \u015fekilde inceledik. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, s\u0131n\u0131f de\u011fi\u015fkenleri g\u00fcc\u00fcn\u00fc ve esnekli\u011fini do\u011fru kullan\u0131ld\u0131\u011f\u0131nda ortaya koyarken, yanl\u0131\u015f anla\u015f\u0131lmalar\u0131 veya hatal\u0131 uygulamalar\u0131 ciddi mant\u0131ksal hatalara yol a\u00e7abilir. Temel \u00e7\u0131kar\u0131m, s\u0131n\u0131f ve \u00f6rnek de\u011fi\u015fkenleri aras\u0131ndaki ayr\u0131m\u0131n net bir \u015fekilde kavranmas\u0131 ve Python'\u0131n nitelik \u00e7\u00f6z\u00fcmleme mekanizmas\u0131n\u0131n derinlemesine anla\u015f\u0131lmas\u0131 gerekti\u011fidir.<\/p>\n<p>\u00d6zellikle, de\u011fi\u015ftirilebilir (mutable) veri tiplerini s\u0131n\u0131f de\u011fi\u015fkeni olarak kullan\u0131rken g\u00f6sterdi\u011fimiz tuzaklar, \u00e7o\u011fu zaman geli\u015ftiricilerin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 en yayg\u0131n ve zorlu sorunlardan biridir. <code>nesne.degisken = deger<\/code> atamas\u0131n\u0131n yeni bir \u00f6rnek de\u011fi\u015fkeni olu\u015fturarak s\u0131n\u0131f de\u011fi\u015fkenini g\u00f6lgelemesi ve <code>nesne.liste.append()<\/code> gibi i\u015flemlerin do\u011frudan s\u0131n\u0131f de\u011fi\u015fkeninin referans etti\u011fi nesneyi de\u011fi\u015ftirmesi aras\u0131ndaki fark\u0131 anlamak hayati \u00f6nem ta\u015f\u0131r. Bu fark\u0131 bilmek, beklenmedik yan etkileri \u00f6nlemenin ve kodunuzun \u00f6ng\u00f6r\u00fclebilirli\u011fini sa\u011flaman\u0131n anahtar\u0131d\u0131r.<\/p>\n<p>Ger\u00e7ek d\u00fcnya vaka analizleri ile, bu teorik bilgilerin pratik uygulamalarda (varsay\u0131lan ayarlar, envanter y\u00f6netimi, veritaban\u0131 havuzlar\u0131 gibi) nas\u0131l somut sorunlara d\u00f6n\u00fc\u015ft\u00fc\u011f\u00fcn\u00fc ve bu sorunlar\u0131n nas\u0131l \u00e7\u00f6z\u00fclebilece\u011fini g\u00f6rd\u00fck. S\u0131n\u0131f de\u011fi\u015fkenlerini sabitler, ortak kaynaklar veya basit saya\u00e7lar i\u00e7in kullanmak uygunken, her nesneye \u00f6zg\u00fc durumlar i\u00e7in \u00f6rnek de\u011fi\u015fkenlerini tercih etmek her zaman en iyi yakla\u015f\u0131md\u0131r. Ayr\u0131ca, <code>@classmethod<\/code> kullanarak s\u0131n\u0131f de\u011fi\u015fkenlerine kontroll\u00fc eri\u015fim sa\u011flamak ve mutable de\u011fi\u015fkenleri <code>__init__<\/code> metodunda kopyalayarak her \u00f6rne\u011fe ba\u011f\u0131ms\u0131zl\u0131k kazand\u0131rmak gibi en iyi uygulamalar\u0131 da ele ald\u0131k.<\/p>\n<p>Son olarak, <code>__slots__<\/code> ile bellek optimizasyonu ve nitelik eri\u015fimini h\u0131zland\u0131rma, <code>@property<\/code> ile niteliklere kontroll\u00fc ve \"Pythonik\" bir aray\u00fcz sunma gibi ileri d\u00fczey teknikler, kodunuzun kalitesini, performans\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini bir \u00fcst seviyeye ta\u015f\u0131man\u0131za yard\u0131mc\u0131 olacakt\u0131r. Mobil uyumlu aray\u00fczler \u00f6rne\u011finde g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, Python s\u0131n\u0131f de\u011fi\u015fkenleri dolayl\u0131 yoldan front-end'in davran\u0131\u015f\u0131n\u0131 ve g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc etkileyen merkezi yap\u0131land\u0131rma kararlar\u0131n\u0131n temelini de olu\u015fturabilir.<\/p>\n<p>Unutmay\u0131n, Python'da ustala\u015fmak, dilin sundu\u011fu esnekliklerin arkas\u0131ndaki mekanizmalar\u0131 anlamaktan ge\u00e7er. S\u0131n\u0131f de\u011fi\u015fkenleri, bu mekanizmalardan sadece biridir. Bu makaledeki bilgileri uygulayarak, daha g\u00fc\u00e7l\u00fc, daha az hataya a\u00e7\u0131k ve daha anla\u015f\u0131l\u0131r Python kodlar\u0131 yazma yolunda \u00f6nemli bir ad\u0131m atm\u0131\u015f olacaks\u0131n\u0131z. Her zaman denemekten, \u00f6\u011frenmekten ve ke\u015ffetmekten \u00e7ekinmeyin!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li>\n        <strong>S: S\u0131n\u0131f de\u011fi\u015fkenleri ve \u00f6rnek de\u011fi\u015fkenleri aras\u0131ndaki temel fark nedir?<\/strong><br \/>\n        <strong>C:<\/strong> S\u0131n\u0131f de\u011fi\u015fkenleri, bir s\u0131n\u0131f\u0131n t\u00fcm \u00f6rnekleri taraf\u0131ndan payla\u015f\u0131lan de\u011fi\u015fkenlerdir ve s\u0131n\u0131f\u0131n tan\u0131m\u0131nda yer al\u0131rlar. \u00d6rnek de\u011fi\u015fkenleri ise, her nesnenin kendi ba\u011f\u0131ms\u0131z kopyas\u0131na sahip oldu\u011fu ve genellikle <code>__init__<\/code> metodunda <code>self<\/code> anahtar kelimesiyle tan\u0131mlanan de\u011fi\u015fkenlerdir. S\u0131n\u0131f de\u011fi\u015fkeni bir kez bellekte yer al\u0131rken, her \u00f6rnek de\u011fi\u015fkeni her nesne i\u00e7in ayr\u0131 ayr\u0131 bellekte yer kaplar.\n    <\/li>\n<li>\n        <strong>S: Neden bir \u00f6rnek \u00fczerinden s\u0131n\u0131f de\u011fi\u015fkenini de\u011fi\u015ftirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131mda di\u011fer \u00f6rnekler etkilenmiyor?<\/strong><br \/>\n        <strong>C:<\/strong> <code>nesne.sinif_degiskeni = yeni_deger<\/code> \u015feklinde bir atama yapt\u0131\u011f\u0131n\u0131zda, Python s\u0131n\u0131f de\u011fi\u015fkenini de\u011fi\u015ftirmez. Bunun yerine, o spesifik nesne i\u00e7in ayn\u0131 ada sahip yeni bir \u00f6rnek de\u011fi\u015fkeni olu\u015fturur. Bu yeni \u00f6rnek de\u011fi\u015fkeni, s\u0131n\u0131f de\u011fi\u015fkenini g\u00f6lgeler. Di\u011fer nesneler ve s\u0131n\u0131f\u0131n kendisi hala orijinal s\u0131n\u0131f de\u011fi\u015fkenine eri\u015fmeye devam eder.\n    <\/li>\n<li>\n        <strong>S: Listeler veya s\u00f6zl\u00fckler gibi de\u011fi\u015ftirilebilir (mutable) veri tiplerini s\u0131n\u0131f de\u011fi\u015fkeni olarak kullanmak neden sorunlara yol a\u00e7ar?<\/strong><br \/>\n        <strong>C:<\/strong> De\u011fi\u015ftirilebilir bir s\u0131n\u0131f de\u011fi\u015fkeni (\u00f6rne\u011fin bir liste), t\u00fcm \u00f6rnekler taraf\u0131ndan ayn\u0131 bellek konumunu payla\u015f\u0131r. Bir \u00f6rnek bu listenin metotlar\u0131n\u0131 (\u00f6rne\u011fin <code>.append()<\/code>) kullanarak listeyi de\u011fi\u015ftirdi\u011finde, bu de\u011fi\u015fiklik do\u011frudan payla\u015f\u0131lan bellek konumunda ger\u00e7ekle\u015fir. Dolay\u0131s\u0131yla, bu de\u011fi\u015fikli\u011fi t\u00fcm di\u011fer \u00f6rnekler ve s\u0131n\u0131f\u0131n kendisi de g\u00f6r\u00fcr, \u00e7\u00fcnk\u00fc hepsi ayn\u0131 liste nesnesine referans verir. Bu durum beklenmedik yan etkilere yol a\u00e7abilir.\n    <\/li>\n<li>\n        <strong>S: De\u011fi\u015ftirilebilir s\u0131n\u0131f de\u011fi\u015fkenlerinin yol a\u00e7t\u0131\u011f\u0131 sorunlardan ka\u00e7\u0131nmak i\u00e7in ne yapmal\u0131y\u0131m?<\/strong><br \/>\n        <strong>C:<\/strong> En iyi uygulama, de\u011fi\u015ftirilebilir veri tiplerini s\u0131n\u0131f de\u011fi\u015fkeni olarak kullanmaktan genellikle ka\u00e7\u0131nmakt\u0131r. E\u011fer bir s\u0131n\u0131f\u0131n varsay\u0131lan de\u011fi\u015ftirilebilir bir de\u011fi\u015fkenini her \u00f6rne\u011fin kendi ba\u011f\u0131ms\u0131z kopyas\u0131 olarak kullanmas\u0131n\u0131 istiyorsan\u0131z, bu kopyalamay\u0131 <code>__init__<\/code> metodunda yapmal\u0131s\u0131n\u0131z (\u00f6rne\u011fin, <code>self.liste = []<\/code> veya <code>self.liste = list(ClassName.varsayilan_liste)<\/code>). E\u011fer mutable s\u0131n\u0131f de\u011fi\u015fkeni kullanmak zorundaysan\u0131z (\u00f6rne\u011fin, ortak bir kaynak havuzu), bu de\u011fi\u015fkeni y\u00f6netmek i\u00e7in <code>@classmethod<\/code> kullanmak gibi kontroll\u00fc eri\u015fim noktalar\u0131 sa\u011flamal\u0131s\u0131n\u0131z.\n    <\/li>\n<li>\n        <strong>S: <code>__slots__<\/code> ve <code>@property<\/code> ne i\u015fe yarar ve ne zaman kullanmal\u0131y\u0131m?<\/strong><br \/>\n        <strong>C:<\/strong> <code>__slots__<\/code>, bir s\u0131n\u0131f\u0131n \u00f6rneklerinin bellek t\u00fcketimini azaltmak ve nitelik eri\u015fimini h\u0131zland\u0131rmak i\u00e7in kullan\u0131l\u0131r. Ayr\u0131ca, s\u0131n\u0131fta tan\u0131mlanmam\u0131\u015f yeni niteliklerin dinamik olarak eklenmesini engelleyerek kodun daha \u00f6ng\u00f6r\u00fclebilir olmas\u0131n\u0131 sa\u011flar. <code>@property<\/code> ise, niteliklere (getter, setter, deleter) eri\u015fimi kontroll\u00fc bir \u015fekilde y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Bu, veri do\u011frulama, hesaplama veya i\u00e7 durumu gizleme gibi i\u015f mant\u0131klar\u0131n\u0131 nitelik eri\u015fimine dahil etmenize olanak tan\u0131r. Her ikisi de performans optimizasyonu ve kod kalitesini art\u0131rmak i\u00e7in ileri d\u00fczey tekniklerdir.\n    <\/li>\n<\/ol>\n<\/article>\n","protected":false},"excerpt":{"rendered":"Python S\u0131n\u0131f De\u011fi\u015fkenleri: Beklenmedik Davran\u0131\u015flar\u0131n S\u0131rr\u0131 Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor musunuz? Bu&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-32744","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus...<\/title>\n<meta name=\"description\" content=\"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor musunuz? Bu kapsaml\u0131 rehber, ortak tuzaklar\u0131 anlaman\u0131za ve kodunuzu g\u00fc\u00e7lendirmenize yard\u0131mc\u0131 olacak.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus...\" \/>\n<meta property=\"og:description\" content=\"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor musunuz? Bu kapsaml\u0131 rehber, ortak tuzaklar\u0131 anlaman\u0131za ve kodunuzu g\u00fc\u00e7lendirmenize yard\u0131mc\u0131 olacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-25T09:31:41+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"35 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus&#8230;\",\"datePublished\":\"2025-10-25T09:31:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/\"},\"wordCount\":5381,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/\",\"name\":\"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus...\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-25T09:31:41+00:00\",\"description\":\"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor musunuz? Bu kapsaml\u0131 rehber, ortak tuzaklar\u0131 anlaman\u0131za ve kodunuzu g\u00fc\u00e7lendirmenize yard\u0131mc\u0131 olacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus&#8230;\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus...","description":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor musunuz? Bu kapsaml\u0131 rehber, ortak tuzaklar\u0131 anlaman\u0131za ve kodunuzu g\u00fc\u00e7lendirmenize yard\u0131mc\u0131 olacak.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/","og_locale":"tr_TR","og_type":"article","og_title":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus...","og_description":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor musunuz? Bu kapsaml\u0131 rehber, ortak tuzaklar\u0131 anlaman\u0131za ve kodunuzu g\u00fc\u00e7lendirmenize yard\u0131mc\u0131 olacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-25T09:31:41+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"35 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus&#8230;","datePublished":"2025-10-25T09:31:41+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/"},"wordCount":5381,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/","url":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/","name":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus...","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-25T09:31:41+00:00","description":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor musunuz? Bu kapsaml\u0131 rehber, ortak tuzaklar\u0131 anlaman\u0131za ve kodunuzu g\u00fc\u00e7lendirmenize yard\u0131mc\u0131 olacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-sinif-degiskenlerinin-neden-bazen-kafa-karistirici-davrandigini-merak-ediyor-mus\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python s\u0131n\u0131f de\u011fi\u015fkenlerinin neden bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 davrand\u0131\u011f\u0131n\u0131 merak ediyor mus&#8230;"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32744"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32744\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}