{"id":37206,"date":"2025-12-28T22:00:40","date_gmt":"2025-12-28T19:00:40","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/"},"modified":"2025-12-28T22:00:40","modified_gmt":"2025-12-28T19:00:40","slug":"pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/","title":{"rendered":"Python&#8217;da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli?"},"content":{"rendered":"<h2>Python&#8217;da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli?<\/h2>\n<p>Python, esnek ve dinamik yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan bir programlama dilidir. Bu dinamizmin \u00f6nemli ara\u00e7lar\u0131ndan biri de nesnelerin niteliklerine (attribute) veya metotlar\u0131na \u00e7al\u0131\u015fma zaman\u0131nda eri\u015fim sa\u011flayan <code>getattr()<\/code> fonksiyonudur. Bu makalede, <code>getattr<\/code>&#8216;\u0131n ne oldu\u011funu, temel kullan\u0131m senaryolar\u0131n\u0131, hata y\u00f6netimini, ileri d\u00fczey uygulamalar\u0131n\u0131 ve dikkat edilmesi gereken noktalar\u0131 detayl\u0131 kod \u00f6rnekleriyle inceleyece\u011fiz. Python projelerinizde daha esnek ve g\u00fc\u00e7l\u00fc yap\u0131lar kurmak i\u00e7in <code>getattr<\/code>&#8216;\u0131 ne zaman ve nas\u0131l kullanman\u0131z gerekti\u011fini ke\u015ffedeceksiniz.<\/p>\n<h3>1. Giri\u015f: getattr Nedir?<\/h3>\n<p>Python&#8217;da bir nesnenin niteli\u011fine veya metoduna eri\u015fmek genellikle nokta (.) operat\u00f6r\u00fc ile yap\u0131l\u0131r (\u00f6rne\u011fin, <code>nesne.nitelik<\/code>). Ancak baz\u0131 durumlarda, eri\u015fmek istedi\u011fimiz niteli\u011fin ad\u0131 \u00e7al\u0131\u015fma zaman\u0131nda belirlenir veya dinamik olarak de\u011fi\u015febilir. \u0130\u015fte tam bu noktada <code>getattr()<\/code> fonksiyonu devreye girer. Bu fonksiyon, bir nesnenin ad\u0131n\u0131 string olarak verilen bir niteli\u011fine g\u00fcvenli ve dinamik bir \u015fekilde eri\u015fmenizi sa\u011flar.<\/p>\n<h4>1.1. getattr Fonksiyonunun Temelleri<\/h4>\n<p><code>getattr()<\/code>, Python&#8217;\u0131n yerle\u015fik (built-in) fonksiyonlar\u0131ndan biridir. Bir objenin belirli bir niteli\u011fine, niteli\u011fin ad\u0131n\u0131 bir string olarak vererek eri\u015fim sa\u011flar. Bu, \u00f6zellikle program\u0131n\u0131z\u0131n \u00e7al\u0131\u015fma an\u0131nda hangi niteli\u011fe eri\u015filece\u011fine karar vermesi gerekti\u011fi durumlarda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4>1.2. S\u00f6zdizimi ve Parametreler<\/h4>\n<p><code>getattr()<\/code> fonksiyonunun temel s\u00f6zdizimi \u015fu \u015fekildedir:<\/p>\n<pre><code class=\"language-python\">getattr(object, name[, default])<\/pre>\n<p><\/code><\/p>\n<ul>\n<li><code>object<\/code>: Niteliklerine eri\u015fmek istedi\u011finiz nesne (\u00f6rne\u011fin, bir s\u0131n\u0131f \u00f6rne\u011fi, mod\u00fcl, vb.).<\/li>\n<li><code>name<\/code>: Eri\u015filmek istenen niteli\u011fin veya metodun ad\u0131n\u0131 i\u00e7eren bir string.<\/li>\n<li><code>default<\/code> (iste\u011fe ba\u011fl\u0131): E\u011fer belirtilen nitelik nesnede bulunamazsa d\u00f6nd\u00fcr\u00fclecek varsay\u0131lan de\u011fer. Bu parametre verilmezse ve nitelik bulunamazsa bir <code>AttributeError<\/code> hatas\u0131 f\u0131rlat\u0131l\u0131r.<\/li>\n<\/ul>\n<h4>1.3. Neden Dinamik Eri\u015fime \u0130htiya\u00e7 Duyar\u0131z?<\/h4>\n<p>Dinamik eri\u015fim, kodunuzu daha esnek, yap\u0131land\u0131r\u0131labilir ve geni\u015fletilebilir hale getirir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n girdisine g\u00f6re farkl\u0131 metotlar\u0131 \u00e7a\u011f\u0131rman\u0131z gerekti\u011finde, bir yap\u0131land\u0131rma dosyas\u0131ndan okunan anahtarlara g\u00f6re nesne niteliklerine eri\u015fmeniz gerekti\u011finde veya bir plugin sisteminde dinamik olarak mod\u00fcl fonksiyonlar\u0131n\u0131 y\u00fcklemeniz gerekti\u011finde <code>getattr()<\/code> vazge\u00e7ilmez bir ara\u00e7 haline gelir.<\/p>\n<h3>2. getattr'\u0131n Temel Kullan\u0131m Senaryolar\u0131<\/h3>\n<p><code>getattr()<\/code> fonksiyonu, bir\u00e7ok farkl\u0131 senaryoda programc\u0131lara b\u00fcy\u00fck kolayl\u0131k sa\u011flar. \u0130\u015fte en yayg\u0131n temel kullan\u0131m alanlar\u0131ndan baz\u0131lar\u0131:<\/p>\n<h4>2.1. Dinamik Metot \u00c7a\u011fr\u0131lar\u0131<\/h4>\n<p>Bir nesnenin metotlar\u0131n\u0131, metot ad\u0131n\u0131 bir string olarak bilerek \u00e7a\u011f\u0131rmak istedi\u011finizde <code>getattr()<\/code> idealdir. Bu, \u00f6zellikle bir \"dispatcher\" veya \"router\" mekanizmas\u0131 kurarken kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\">class HesapMakinesi:\n    def topla(self, a, b):\n        return a + b\n    \n    def cikar(self, a, b):\n        return a - b\n\nhesap = HesapMakinesi()\nislem_adi = \"topla\"\nmetot = getattr(hesap, islem_adi) # 'topla' metodunu al\u0131r\nsonuc = metot(10, 5)\nprint(f\"Sonu\u00e7: {sonuc}\") # \u00c7\u0131kt\u0131: Sonu\u00e7: 15\n\nislem_adi_2 = \"cikar\"\nmetot_2 = getattr(hesap, islem_adi_2)\nsonuc_2 = metot_2(20, 7)\nprint(f\"Sonu\u00e7 2: {sonuc_2}\") # \u00c7\u0131kt\u0131: Sonu\u00e7 2: 13\n<\/pre>\n<p><\/code><\/p>\n<h4>2.2. Yap\u0131land\u0131rma Dosyalar\u0131n\u0131 Okuma<\/h4>\n<p>Uygulamalar\u0131n yap\u0131land\u0131rma ayarlar\u0131 genellikle bir dosyadan (INI, YAML, JSON vb.) okunur. Bu ayarlar\u0131 bir nesneye y\u00fckleyip dinamik olarak eri\u015fmek istedi\u011finizde <code>getattr()<\/code> kullan\u0131labilir.<\/p>\n<pre><code class=\"language-python\">class Ayarlar:\n    def __init__(self, config_dict):\n        for key, value in config_dict.items():\n            setattr(self, key, value)\n\nconfig = {\n    \"veritabani_host\": \"localhost\",\n    \"veritabani_port\": 5432,\n    \"debug_modu\": True\n}\n\nuygulama_ayarlari = Ayarlar(config)\n\n# Dinamik olarak ayar de\u011ferlerine eri\u015fim\nhost = getattr(uygulama_ayarlari, \"veritabani_host\")\nport = getattr(uygulama_ayarlari, \"veritabani_port\")\nprint(f\"Veritaban\u0131 Host: {host}, Port: {port}\") # \u00c7\u0131kt\u0131: Veritaban\u0131 Host: localhost, Port: 5432\n<\/pre>\n<p><\/code><\/p>\n<h4>2.3. API Entegrasyonlar\u0131 ve Esnek Veri \u0130\u015fleme<\/h4>\n<p>Harici API'lerden gelen verileri i\u015flerken, alan adlar\u0131 dinamik olarak de\u011fi\u015febilir veya belirli ko\u015fullara ba\u011fl\u0131 olarak farkl\u0131 alanlara eri\u015fmeniz gerekebilir. <code>getattr()<\/code>, bu t\u00fcr senaryolarda esneklik sa\u011flar.<\/p>\n<pre><code class=\"language-python\">class Kullanici:\n    def __init__(self, veri):\n        self.ad = veri.get(\"ad\")\n        self.soyad = veri.get(\"soyad\")\n        self.email = veri.get(\"email\")\n\napi_verisi = {\"ad\": \"Ali\", \"soyad\": \"Can\", \"email\": \"ali@example.com\"}\nkullanici = Kullanici(api_verisi)\n\nistenen_alan = \"ad\"\ndeger = getattr(kullanici, istenen_alan)\nprint(f\"Kullan\u0131c\u0131n\u0131n {istenen_alan} alan\u0131: {deger}\") # \u00c7\u0131kt\u0131: Kullan\u0131c\u0131n\u0131n ad alan\u0131: Ali\n\nistenen_alan_2 = \"email\"\ndeger_2 = getattr(kullanici, istenen_alan_2)\nprint(f\"Kullan\u0131c\u0131n\u0131n {istenen_alan_2} alan\u0131: {deger_2}\") # \u00c7\u0131kt\u0131: Kullan\u0131c\u0131n\u0131n email alan\u0131: ali@example.com\n<\/pre>\n<p><\/code><\/p>\n<h3>3. getattr ile Hata Y\u00f6netimi ve Varsay\u0131lan De\u011ferler<\/h3>\n<p>Dinamik eri\u015fimde en \u00f6nemli konulardan biri, istenen niteli\u011fin nesnede bulunmama ihtimalidir. <code>getattr()<\/code> bu durumu zarif bir \u015fekilde y\u00f6netmek i\u00e7in bir mekanizma sunar.<\/p>\n<h4>3.1. AttributeError ve Yakalanmas\u0131<\/h4>\n<p>E\u011fer <code>getattr()<\/code> fonksiyonuna \u00fc\u00e7\u00fcnc\u00fc parametre olarak varsay\u0131lan bir de\u011fer verilmezse ve istenen nitelik nesnede bulunamazsa, Python bir <code>AttributeError<\/code> hatas\u0131 f\u0131rlat\u0131r. Bu hatay\u0131 <code>try-except<\/code> bloklar\u0131 ile yakalayarak program\u0131n\u0131z\u0131n \u00e7\u00f6kmesini engelleyebilirsiniz.<\/p>\n<pre><code class=\"language-python\">class Ayarlar:\n    def __init__(self):\n        self.host = \"localhost\"\n\nayarlar = Ayarlar()\n\ntry:\n    port = getattr(ayarlar, \"port\")\n    print(f\"Port: {port}\")\nexcept AttributeError:\n    print(\"Hata: 'port' niteli\u011fi bulunamad\u0131.\") # \u00c7\u0131kt\u0131: Hata: 'port' niteli\u011fi bulunamad\u0131.\n<\/pre>\n<p><\/code><\/p>\n<h4>3.2. \u00dc\u00e7\u00fcnc\u00fc Parametrenin \u00d6nemi: Varsay\u0131lan De\u011ferler<\/h4>\n<p><code>getattr()<\/code> fonksiyonunun \u00fc\u00e7\u00fcnc\u00fc parametresi, niteli\u011fin bulunamamas\u0131 durumunda d\u00f6nd\u00fcr\u00fclecek bir varsay\u0131lan de\u011fer belirtmenizi sa\u011flar. Bu, <code>try-except<\/code> blo\u011fu kullanmaktan daha k\u0131sa ve temiz bir \u00e7\u00f6z\u00fcmd\u00fcr ve kodun okunabilirli\u011fini art\u0131r\u0131r.<\/p>\n<pre><code class=\"language-python\">class Ayarlar:\n    def __init__(self):\n        self.host = \"localhost\"\n\nayarlar = Ayarlar()\n\n# 'port' niteli\u011fi yoksa 8080 d\u00f6nd\u00fcr\nport = getattr(ayarlar, \"port\", 8080)\nprint(f\"Port: {port}\") # \u00c7\u0131kt\u0131: Port: 8080\n\n# 'host' niteli\u011fi var, kendi de\u011ferini d\u00f6nd\u00fcr\u00fcr\nhost = getattr(ayarlar, \"host\", \"127.0.0.1\")\nprint(f\"Host: {host}\") # \u00c7\u0131kt\u0131: Host: localhost\n<\/pre>\n<p><\/code><\/p>\n<h4>3.3. G\u00fcvenli Dinamik Eri\u015fim Sa\u011flama<\/h4>\n<p>Varsay\u0131lan de\u011fer kullan\u0131m\u0131, \u00f6zellikle d\u0131\u015f kaynaklardan gelen veya iste\u011fe ba\u011fl\u0131 olabilecek niteliklere eri\u015firken kodunuzu daha sa\u011flam hale getirir. Bu, beklenmedik durumlar\u0131 zarif\u00e7e ele alman\u0131z\u0131 ve program\u0131n\u0131z\u0131n istikrarl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flaman\u0131z\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>4. getattr'\u0131n \u0130leri Seviye Kullan\u0131m Alanlar\u0131<\/h3>\n<p><code>getattr()<\/code>, basit dinamik eri\u015fimin \u00f6tesinde, daha karma\u015f\u0131k ve mod\u00fcler sistemlerin in\u015fas\u0131nda da kilit rol oynar.<\/p>\n<h4>4.1. Plugin ve Mod\u00fcl Sistemleri<\/h4>\n<p>Bir uygulaman\u0131n farkl\u0131 \u00f6zelliklerini veya eklentilerini ayr\u0131 mod\u00fcller olarak tasarlad\u0131\u011f\u0131n\u0131zda, bu mod\u00fcllerdeki belirli fonksiyonlar\u0131 veya s\u0131n\u0131flar\u0131 dinamik olarak y\u00fcklemek ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>getattr()<\/code> kullan\u0131labilir. Bu, uygulaman\u0131n \u00e7ekirde\u011fini de\u011fi\u015ftirmeden yeni \u00f6zellikler eklemeye olanak tan\u0131r.<\/p>\n<pre><code class=\"language-python\"># plugin_modulu.py\ndef islem_yap(veri):\n    return f\"Plugin i\u015flemi: {veri.upper()}\"\n\n# Ana uygulama\nimport importlib\n\nplugin_adi = \"plugin_modulu\"\ntry:\n    plugin = importlib.import_module(plugin_adi)\n    fonksiyon = getattr(plugin, \"islem_yap\")\n    sonuc = fonksiyon(\"merhaba d\u00fcnya\")\n    print(sonuc) # \u00c7\u0131kt\u0131: Plugin i\u015flemi: MERHABA D\u00dcNYA\nexcept (ImportError, AttributeError) as e:\n    print(f\"Plugin y\u00fcklenirken hata olu\u015ftu: {e}\")\n<\/pre>\n<p><\/code><\/p>\n<h4>4.2. ORM (Object-Relational Mapping) K\u00fct\u00fcphaneleri<\/h4>\n<p>Django ORM veya SQLAlchemy gibi k\u00fct\u00fcphaneler, veritaban\u0131 tablolar\u0131n\u0131 Python nesnelerine e\u015fler. Bu k\u00fct\u00fcphaneler, veritaban\u0131 s\u00fctun adlar\u0131n\u0131 dinamik olarak nesne niteliklerine d\u00f6n\u00fc\u015ft\u00fcrmek ve bu niteliklere eri\u015fmek i\u00e7in yo\u011fun bir \u015fekilde <code>getattr()<\/code> ve <code>setattr()<\/code> kullan\u0131r.<\/p>\n<h4>4.3. Test Otomasyonunda Dinamik Obje Manip\u00fclasyonu<\/h4>\n<p>Test yazarken, farkl\u0131 senaryolar\u0131 sim\u00fcle etmek i\u00e7in bir nesnenin belirli niteliklerini veya metotlar\u0131n\u0131 dinamik olarak de\u011fi\u015ftirmek veya \u00e7a\u011f\u0131rmak gerekebilir. <code>getattr()<\/code> ve <code>setattr()<\/code> bu t\u00fcr \"mocking\" ve \"patching\" i\u015flemlerinde esneklik sa\u011flar.<\/p>\n<h3>5. getattr Kullan\u0131m\u0131nda Dikkat Edilmesi Gerekenler ve Alternatifler<\/h3>\n<p><code>getattr()<\/code> g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, her zaman en iyi \u00e7\u00f6z\u00fcm olmayabilir ve baz\u0131 riskleri beraberinde getirebilir. Bilin\u00e7li kullan\u0131m i\u00e7in bu noktalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h4>5.1. Performans Etkileri<\/h4>\n<p>Nokta (.) operat\u00f6r\u00fc ile do\u011frudan nitelik eri\u015fimi, <code>getattr()<\/code>'a g\u00f6re genellikle daha h\u0131zl\u0131d\u0131r. <code>getattr()<\/code>, \u00e7al\u0131\u015fma zaman\u0131nda bir isim \u00e7\u00f6z\u00fcmlemesi (name lookup) yapt\u0131\u011f\u0131 i\u00e7in hafif bir performans ek y\u00fck\u00fcne sahiptir. \u00c7ok y\u00fcksek frekansl\u0131 eri\u015fim gerektiren kritik kod bloklar\u0131nda bu fark g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r. Ancak \u00e7o\u011fu uygulamada bu fark ihmal edilebilir d\u00fczeydedir.<\/p>\n<h4>5.2. G\u00fcvenlik Riskleri (K\u00f6t\u00fc Niyetli Kod Enjeksiyonu)<\/h4>\n<p>E\u011fer <code>getattr()<\/code>'\u0131n ikinci parametresi (nitelik ad\u0131) do\u011frudan kullan\u0131c\u0131 girdisinden geliyorsa, ciddi g\u00fcvenlik riskleri olu\u015fturabilir. K\u00f6t\u00fc niyetli bir kullan\u0131c\u0131, sistemde var olan hassas metotlar\u0131 veya nitelikleri \u00e7a\u011f\u0131rarak g\u00fcvenlik a\u00e7\u0131klar\u0131 olu\u015fturabilir. Bu nedenle, kullan\u0131c\u0131dan gelen girdileri her zaman do\u011frulamak ve izin verilen nitelik adlar\u0131n\u0131n bir \"whitelist\"ini tutmak \u00f6nemlidir.<\/p>\n<pre><code class=\"language-python\">class Yonetici:\n    def veritabanini_sil(self):\n        print(\"Veritaban\u0131 siliniyor...\")\n    \n    def kullanici_ekle(self):\n        print(\"Kullan\u0131c\u0131 ekleniyor...\")\n\nadmin = Yonetici()\nkomut = input(\"Hangi i\u015flemi yapmak istersiniz? \") # Kullan\u0131c\u0131dan gelen girdi\n\n# G\u00fcvenlik kontrol\u00fc olmadan do\u011frudan kullan\u0131m \u00c7OK TEHL\u0130KEL\u0130!\n# getattr(admin, komut)() # Kullan\u0131c\u0131 \"veritabanini_sil\" yazarsa sorun olur\n\n# G\u00fcvenli yakla\u015f\u0131m: \u0130zin verilen komutlar\u0131 kontrol et\nizinli_komutlar = [\"kullanici_ekle\"]\nif komut in izinli_komutlar:\n    getattr(admin, komut)()\nelse:\n    print(\"Ge\u00e7ersiz veya yetkisiz komut.\")\n<\/pre>\n<p><\/code><\/p>\n<h4>5.3. hasattr() ve setattr() ile \u0130li\u015fkisi<\/h4>\n<p><code>getattr()<\/code> genellikle <code>hasattr()<\/code> ve <code>setattr()<\/code> ile birlikte kullan\u0131l\u0131r:<\/p>\n<ul>\n<li><code>hasattr(object, name)<\/code>: Bir nesnenin belirtilen niteli\u011fe sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. <code>getattr()<\/code>'\u0131 \u00e7a\u011f\u0131rmadan \u00f6nce bir niteli\u011fin varl\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in kullan\u0131labilir.<\/li>\n<li><code>setattr(object, name, value)<\/code>: Bir nesnenin belirtilen niteli\u011fini dinamik olarak ayarlar veya yeni bir nitelik ekler.<\/li>\n<\/ul>\n<pre><code class=\"language-python\">class Ogrenci:\n    def __init__(self, ad):\n        self.ad = ad\n\nogrenci = Ogrenci(\"Ay\u015fe\")\n\nif hasattr(ogrenci, \"yas\"):\n    print(f\"\u00d6\u011frencinin ya\u015f\u0131: {getattr(ogrenci, 'yas')}\")\nelse:\n    print(\"\u00d6\u011frencinin ya\u015f\u0131 bilinmiyor. Ekleniyor...\")\n    setattr(ogrenci, \"yas\", 15)\n    print(f\"\u00d6\u011frencinin yeni ya\u015f\u0131: {getattr(ogrenci, 'yas')}\")\n<\/pre>\n<p><\/code><\/p>\n<h4>5.4. __dict__ ve vars() Kullan\u0131m\u0131<\/h4>\n<p>Python nesnelerinin nitelikleri genellikle <code>__dict__<\/code> \u00f6zel niteli\u011finde saklan\u0131r. Bu, bir nesnenin niteliklerine s\u00f6zl\u00fck benzeri bir aray\u00fczle eri\u015fim sa\u011flar. <code>vars()<\/code> fonksiyonu ise bir mod\u00fcl\u00fcn, s\u0131n\u0131f\u0131n veya bir s\u0131n\u0131f \u00f6rne\u011finin <code>__dict__<\/code> niteli\u011fini d\u00f6nd\u00fcr\u00fcr. Ancak <code>getattr()<\/code>, miras al\u0131nan nitelikleri ve descriptor'lar\u0131 da dikkate al\u0131rken, <code>__dict__<\/code> yaln\u0131zca do\u011frudan tan\u0131mlanm\u0131\u015f nitelikleri g\u00f6sterir. Bu nedenle, genel nitelik eri\u015fimi i\u00e7in <code>getattr()<\/code> tercih edilmelidir.<\/p>\n<h3>6. Kod \u00d6rnekleri ve Uygulamal\u0131 Senaryolar<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi peki\u015ftirmek i\u00e7in daha kapsaml\u0131 kod \u00f6rneklerine bakal\u0131m.<\/p>\n<h4>6.1. Basit Bir S\u0131n\u0131f \u00dczerinde getattr<\/h4>\n<pre><code class=\"language-python\">class Personel:\n    def __init__(self, ad, soyad, departman):\n        self.ad = ad\n        self.soyad = soyad\n        self.departman = departman\n    \n    def tam_ad(self):\n        return f\"{self.ad} {self.soyad}\"\n\npersonel = Personel(\"Deniz\", \"Y\u0131lmaz\", \"Pazarlama\")\n\n# Niteliklere dinamik eri\u015fim\nprint(f\"Personel Ad\u0131: {getattr(personel, 'ad')}\")\nprint(f\"Personel Departman\u0131: {getattr(personel, 'departman')}\")\n\n# Metoda dinamik eri\u015fim ve \u00e7a\u011f\u0131rma\ntam_ad_metodu = getattr(personel, 'tam_ad')\nprint(f\"Tam Ad\u0131: {tam_ad_metodu()}\")\n\n# Olmayan bir niteli\u011fe varsay\u0131lan de\u011ferle eri\u015fim\nmaas = getattr(personel, 'maas', 'Bilinmiyor')\nprint(f\"Maa\u015f: {maas}\")\n<\/pre>\n<p><\/code><\/p>\n<h4>6.2. Dinamik \u0130\u015flem Y\u00f6nlendirici (Dispatcher)<\/h4>\n<p>Kullan\u0131c\u0131dan gelen bir komuta g\u00f6re farkl\u0131 fonksiyonlar\u0131 \u00e7al\u0131\u015ft\u0131ran bir sistem:<\/p>\n<pre><code class=\"language-python\">class IslemYoneticisi:\n    def __init__(self):\n        self.loglar = []\n\n    def kayit_ekle(self, veri):\n        self.loglar.append(f\"Kay\u0131t eklendi: {veri}\")\n        return \"Kay\u0131t ba\u015far\u0131yla eklendi.\"\n\n    def kayit_sil(self, id):\n        self.loglar.append(f\"Kay\u0131t silindi: ID {id}\")\n        return f\"Kay\u0131t ID {id} silindi.\"\n\n    def rapor_olustur(self):\n        self.loglar.append(\"Rapor olu\u015fturuldu.\")\n        return \"Rapor haz\u0131rland\u0131.\"\n\nyonetici = IslemYoneticisi()\n\ndef calistir_komut(yonetici_obj, komut_adi, *args):\n    if not hasattr(yonetici_obj, komut_adi):\n        return f\"Hata: '{komut_adi}' komutu bulunamad\u0131.\"\n    \n    # G\u00fcvenlik i\u00e7in izin verilen komutlar\u0131 kontrol edebilirsiniz.\n    # if komut_adi not in [\"kayit_ekle\", \"kayit_sil\", \"rapor_olustur\"]:\n    #     return \"Hata: Yetkisiz komut.\"\n\n    metot = getattr(yonetici_obj, komut_adi)\n    return metot(*args)\n\nprint(calistir_komut(yonetici, \"kayit_ekle\", \"Yeni m\u00fc\u015fteri verisi\"))\nprint(calistir_komut(yonetici, \"kayit_sil\", 123))\nprint(calistir_komut(yonetici, \"rapor_olustur\"))\nprint(calistir_komut(yonetici, \"bilinmeyen_komut\"))\n\nprint(\"\\nLoglar:\")\nfor log in yonetici.loglar:\n    print(log)\n<\/pre>\n<p><\/code><\/p>\n<h3>Sonu\u00e7<\/h3>\n<p><code>getattr()<\/code> fonksiyonu, Python'\u0131n dinamik do\u011fas\u0131n\u0131n temel ta\u015flar\u0131ndan biridir. Nesne niteliklerine ve metotlar\u0131na \u00e7al\u0131\u015fma zaman\u0131nda string isimleriyle eri\u015fim sa\u011flayarak, kodunuzu daha esnek, yap\u0131land\u0131r\u0131labilir ve geni\u015fletilebilir hale getirir. Dinamik metot \u00e7a\u011fr\u0131lar\u0131ndan yap\u0131land\u0131rma y\u00f6netimine, plugin sistemlerinden API entegrasyonlar\u0131na kadar bir\u00e7ok senaryoda vazge\u00e7ilmez bir ara\u00e7t\u0131r. Ancak, performans etkileri ve \u00f6zellikle kullan\u0131c\u0131 girdisiyle birlikte kullan\u0131ld\u0131\u011f\u0131nda ortaya \u00e7\u0131kabilecek g\u00fcvenlik riskleri g\u00f6z ard\u0131 edilmemelidir. <code>hasattr()<\/code> ve varsay\u0131lan de\u011ferler gibi mekanizmalarla birlikte bilin\u00e7li ve g\u00fcvenli bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131nda, <code>getattr()<\/code> Python programc\u0131l\u0131\u011f\u0131nda size \u00f6nemli bir g\u00fc\u00e7 katacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>getattr() ile nokta (.) operat\u00f6r\u00fc aras\u0131ndaki temel fark nedir?<\/h4>\n<p>Nokta operat\u00f6r\u00fc (<code>obj.nitelik<\/code>), niteli\u011fin ad\u0131n\u0131n kod yaz\u0131l\u0131rken (derleme zaman\u0131nda) bilindi\u011fi statik eri\u015fim sa\u011flar. <code>getattr(obj, \"nitelik_adi\")<\/code> ise niteli\u011fin ad\u0131n\u0131n bir string olarak \u00e7al\u0131\u015fma zaman\u0131nda belirlendi\u011fi dinamik eri\u015fim sa\u011flar. Bu, nitelik ad\u0131n\u0131n bir de\u011fi\u015fkende tutuldu\u011fu veya d\u0131\u015far\u0131dan geldi\u011fi durumlarda gereklidir.<\/p>\n<h4>getattr() kullanmak performans a\u00e7\u0131s\u0131ndan dezavantajl\u0131 m\u0131d\u0131r?<\/h4>\n<p>Evet, genellikle nokta operat\u00f6r\u00fcne g\u00f6re hafif bir performans ek y\u00fck\u00fc vard\u0131r \u00e7\u00fcnk\u00fc \u00e7al\u0131\u015fma zaman\u0131nda bir isim \u00e7\u00f6z\u00fcmlemesi (name lookup) yapar. Ancak \u00e7o\u011fu uygulama i\u00e7in bu fark ihmal edilebilir d\u00fczeydedir. Y\u00fcksek performans gerektiren ve binlerce kez \u00e7a\u011fr\u0131lan kritik d\u00f6ng\u00fclerde bu fark \u00f6nemli hale gelebilir.<\/p>\n<h4>getattr() ile g\u00fcvenlik a\u00e7\u0131klar\u0131 nas\u0131l olu\u015fur ve nas\u0131l \u00f6nlenir?<\/h4>\n<p>E\u011fer <code>getattr()<\/code>'\u0131n ikinci parametresi (nitelik ad\u0131) do\u011frudan veya dolayl\u0131 olarak g\u00fcvenilmeyen bir kaynaktan (\u00f6rne\u011fin kullan\u0131c\u0131 girdisi, a\u011f iste\u011fi) geliyorsa, k\u00f6t\u00fc niyetli bir kullan\u0131c\u0131 sistemde var olan hassas metotlar\u0131 veya nitelikleri \u00e7a\u011f\u0131rarak g\u00fcvenlik a\u00e7\u0131klar\u0131 olu\u015fturabilir. Bunu \u00f6nlemek i\u00e7in, nitelik adlar\u0131n\u0131 her zaman bir \"whitelist\" (izin verilenler listesi) ile kontrol etmek ve sadece izin verilen niteliklerin \u00e7a\u011fr\u0131lmas\u0131na izin vermek \u00f6nemlidir.<\/p>\n<h4>getattr() yerine ne zaman hasattr() kullanmal\u0131y\u0131m?<\/h4>\n<p><code>hasattr(obj, \"nitelik_adi\")<\/code>, bir nesnenin belirli bir niteli\u011fe sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in kullan\u0131l\u0131r ve bir boolean de\u011fer d\u00f6nd\u00fcr\u00fcr. <code>getattr()<\/code> ise niteli\u011fin de\u011ferini d\u00f6nd\u00fcr\u00fcr veya hata f\u0131rlat\u0131r. E\u011fer sadece niteli\u011fin varl\u0131\u011f\u0131n\u0131 kontrol etmek istiyorsan\u0131z <code>hasattr()<\/code> kullan\u0131n. E\u011fer nitelik varsa de\u011ferini almak, yoksa varsay\u0131lan bir de\u011fer kullanmak istiyorsan\u0131z <code>getattr()<\/code>'\u0131n \u00fc\u00e7\u00fcnc\u00fc parametresini kullanmak daha temiz bir yakla\u015f\u0131md\u0131r.<\/p>\n<h4>getattr() sadece niteliklere mi yoksa metotlara da eri\u015febilir mi?<\/h4>\n<p><code>getattr()<\/code> hem niteliklere (veri \u00fcyeleri) hem de metotlara eri\u015febilir. Bir metodu ald\u0131\u011f\u0131n\u0131zda, onu normal bir fonksiyon gibi \u00e7a\u011f\u0131rabilirsiniz (\u00f6rne\u011fin, <code>metot_objesi()<\/code>).<\/p>\n","protected":false},"excerpt":{"rendered":"Python, esnek ve dinamik yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan bir programlama dilidir. Bu dinamizmin \u00f6nemli ara\u00e7lar\u0131ndan biri de nesnelerin niteliklerine (attribute) &#8230;","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-37206","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&#039;da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python&#039;da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli?\" \/>\n<meta property=\"og:description\" content=\"Python, esnek ve dinamik yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan bir programlama dilidir. Bu dinamizmin \u00f6nemli ara\u00e7lar\u0131ndan biri de nesnelerin niteliklerine (attribute) ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-28T19:00:40+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=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python&#8217;da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli?\",\"datePublished\":\"2025-12-28T19:00:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/\"},\"wordCount\":1702,\"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\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/\",\"name\":\"Python'da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-28T19:00:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python&#8217;da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli?\"}]},{\"@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'da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/","og_locale":"tr_TR","og_type":"article","og_title":"Python'da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli?","og_description":"Python, esnek ve dinamik yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan bir programlama dilidir. Bu dinamizmin \u00f6nemli ara\u00e7lar\u0131ndan biri de nesnelerin niteliklerine (attribute) ...","og_url":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-28T19:00:40+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python&#8217;da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli?","datePublished":"2025-12-28T19:00:40+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/"},"wordCount":1702,"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\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/","url":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/","name":"Python'da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-28T19:00:40+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-getattr-kullanimi-ne-zaman-ve-neden-tercih-edilmeli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python&#8217;da getattr Kullan\u0131m\u0131: Ne Zaman ve Neden Tercih Edilmeli?"}]},{"@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\/37206","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=37206"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37206\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}