{"id":40702,"date":"2026-02-28T15:30:42","date_gmt":"2026-02-28T12:30:42","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/"},"modified":"2026-02-28T15:30:42","modified_gmt":"2026-02-28T12:30:42","slug":"quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/","title":{"rendered":"Quark&#8217;\u0131n Ana Hatlar\u0131: Python&#8217;da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131"},"content":{"rendered":"<h2>Quark&#8217;\u0131n Ana Hatlar\u0131: Python&#8217;da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131<\/h2>\n<p>Python, esnekli\u011fi ve dinamik yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan bir programlama dilidir. Bu esnekli\u011fin \u00f6nemli bir par\u00e7as\u0131 da nesne \u00f6zniteliklerine (attribute) eri\u015fim ve bu eri\u015fimin nas\u0131l y\u00f6netilece\u011fidir. Varsay\u0131lan olarak, bir nesnenin \u00f6zniteliklerine nokta operat\u00f6r\u00fc (<code>.<\/code>) ile eri\u015firiz. Ancak, bazen bu standart davran\u0131\u015f\u0131n \u00f6tesine ge\u00e7erek, \u00f6znitelik eri\u015fimini kendi \u00f6zel ihtiya\u00e7lar\u0131m\u0131za g\u00f6re \u015fekillendirmemiz gerekebilir. \u0130\u015fte tam da bu noktada Python&#8217;\u0131n &#8220;magic methods&#8221; (sihirli y\u00f6ntemler) olarak bilinen \u00f6zel metotlar\u0131 devreye girer. Bu makalede, Python&#8217;da \u00f6znitelik eri\u015fimini \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131lan <code>__getattr__<\/code>, <code>__setattr__<\/code>, <code>__delattr__<\/code> ve <code>__getattribute__<\/code> gibi anahtar y\u00f6ntemleri detayl\u0131ca inceleyecek, bunlar\u0131n ne zaman ve nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 pratik \u00f6rneklerle a\u00e7\u0131klayaca\u011f\u0131z. Bu sayede, daha dinamik, g\u00fcvenli ve g\u00fc\u00e7l\u00fc Python s\u0131n\u0131flar\u0131 tasarlaman\u0131n kap\u0131lar\u0131n\u0131 aralayaca\u011f\u0131z.<\/p>\n<h2>Python&#8217;da \u00d6znitelik Eri\u015fiminin Temelleri<\/h2>\n<p>Python&#8217;da nesneler, verileri (\u00f6znitelikler) ve davran\u0131\u015flar\u0131 (metotlar) bir arada bar\u0131nd\u0131ran soyutlamalard\u0131r. Bir nesnenin \u00f6zniteliklerine eri\u015fim, g\u00fcnl\u00fck programlama prati\u011fimizin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. Ancak, bu eri\u015fimin perde arkas\u0131nda nas\u0131l i\u015fledi\u011fini anlamak, geli\u015fmi\u015f \u00f6zelle\u015ftirmeler yapabilmek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Neden \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirmeliyiz?<\/h3>\n<p>\u00d6znitelik eri\u015fimini \u00f6zelle\u015ftirme ihtiyac\u0131, \u00e7e\u015fitli senaryolarda ortaya \u00e7\u0131kabilir. \u00d6rne\u011fin, bir veritaban\u0131 kayd\u0131n\u0131 temsil eden bir nesne d\u00fc\u015f\u00fcn\u00fcn. Bu nesnenin \u00f6zniteliklerine eri\u015fildi\u011finde, veritaban\u0131ndan veri \u00e7ekilmesi veya verinin belirli bir formata d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesi gerekebilir. Ya da bir yap\u0131land\u0131rma nesnesi olu\u015ftururken, mevcut olmayan bir \u00f6zniteli\u011fe eri\u015fildi\u011finde varsay\u0131lan bir de\u011fer d\u00f6nd\u00fcrmek isteyebilirsiniz. G\u00fcvenlik, veri do\u011frulama, dinamik \u00f6znitelik olu\u015fturma veya proxy nesneleri tasarlama gibi durumlar, \u00f6znitelik eri\u015fimini \u00f6zelle\u015ftirmeyi zorunlu k\u0131lar.<\/p>\n<h3>Varsay\u0131lan Davran\u0131\u015f: <code>.<\/code> Operat\u00f6r\u00fc<\/h3>\n<p>Python&#8217;da bir nesnenin \u00f6zniteliklerine eri\u015fmek i\u00e7in genellikle nokta operat\u00f6r\u00fcn\u00fc kullan\u0131r\u0131z. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-python\">class Kullanici:\n    def __init__(self, ad, soyad):\n        self.ad = ad\n        self.soyad = soyad\n\nk = Kullanici(\"Ay\u015fe\", \"Y\u0131lmaz\")\nprint(k.ad)  # \"Ay\u015fe\" \u00e7\u0131kt\u0131s\u0131n\u0131 verir\n<\/pre>\n<p><\/code><\/p>\n<p>Bu basit eri\u015fim, Python'\u0131n dahili mekanizmalar\u0131 taraf\u0131ndan y\u00f6netilir. Nesnenin <code>__dict__<\/code> s\u00f6zl\u00fc\u011f\u00fcne bak\u0131larak \u00f6zniteli\u011fin var olup olmad\u0131\u011f\u0131 kontrol edilir ve varsa de\u011feri d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/p>\n<h3>Dahili Y\u00f6ntemler (Magic Methods) Nedir?<\/h3>\n<p>Python'daki dahili y\u00f6ntemler, \u00e7ift alt \u00e7izgi ile ba\u015flayan ve biten \u00f6zel metotlard\u0131r (\u00f6rne\u011fin, <code>__init__<\/code>, <code>__str__<\/code>). Bu y\u00f6ntemler, belirli i\u015flemler (nesne olu\u015fturma, stringe d\u00f6n\u00fc\u015ft\u00fcrme, \u00f6znitelik eri\u015fimi vb.) ger\u00e7ekle\u015fti\u011finde Python yorumlay\u0131c\u0131s\u0131 taraf\u0131ndan otomatik olarak \u00e7a\u011fr\u0131l\u0131r. \u00d6znitelik eri\u015fimini \u00f6zelle\u015ftirmek i\u00e7in kullanaca\u011f\u0131m\u0131z <code>__getattr__<\/code>, <code>__setattr__<\/code>, <code>__delattr__<\/code> ve <code>__getattribute__<\/code> de bu \"magic methods\" kategorisine girer.<\/p>\n<h2><code>__getattr__<\/code> ve Eksik \u00d6znitelik Y\u00f6netimi<\/h2>\n<p><code>__getattr__(self, name)<\/code> y\u00f6ntemi, bir nesnenin mevcut olmayan bir \u00f6zniteli\u011fine eri\u015filmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda otomatik olarak \u00e7a\u011fr\u0131l\u0131r. Bu, dinamik \u00f6znitelikler olu\u015fturmak veya varsay\u0131lan de\u011ferler d\u00f6nd\u00fcrmek i\u00e7in ideal bir ara\u00e7t\u0131r.<\/p>\n<h3><code>__getattr__<\/code> Ne Zaman Tetiklenir?<\/h3>\n<p><code>__getattr__<\/code>, Python bir \u00f6zniteli\u011fi normal yollarla (yani nesnenin <code>__dict__<\/code>'inde veya s\u0131n\u0131f\u0131n kal\u0131t\u0131m zincirinde) bulamad\u0131\u011f\u0131nda tetiklenir. E\u011fer \u00f6znitelik mevcutsa, bu y\u00f6ntem \u00e7a\u011fr\u0131lmaz.<\/p>\n<h3>Dinamik \u00d6znitelikler Olu\u015fturma<\/h3>\n<p><code>__getattr__<\/code>'\u0131 kullanarak, asl\u0131nda var olmayan ancak eri\u015fildi\u011finde dinamik olarak olu\u015fturulan veya hesaplanan \u00f6znitelikler tan\u0131mlayabiliriz. Bu, esnek API'ler veya proxy nesneleri olu\u015fturmak i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\">class Ayarlar:\n    def __init__(self, varsayilan_deger=\"BILINMIYOR\"):\n        self.varsayilan_deger = varsayilan_deger\n        self._ayarlar = {}\n\n    def __getattr__(self, name):\n        # \u00d6znitelik mevcut de\u011filse, varsay\u0131lan de\u011feri d\u00f6nd\u00fcr\n        if name in self._ayarlar:\n            return self._ayarlar[name]\n        print(f\"Uyar\u0131: '{name}' ayar\u0131 bulunamad\u0131. Varsay\u0131lan de\u011fer kullan\u0131l\u0131yor.\")\n        return self.varsayilan_deger\n\n    def set_ayar(self, key, value):\n        self._ayarlar[key] = value\n\nayarlar = Ayarlar()\nayarlar.set_ayar(\"veritabani_host\", \"localhost\")\n\nprint(ayarlar.veritabani_host) # 'localhost'\nprint(ayarlar.api_key)        # 'Uyar\u0131...' ve 'BILINMIYOR'\nprint(ayarlar.mevcut_olmayan) # 'Uyar\u0131...' ve 'BILINMIYOR'\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>api_key<\/code> \u00f6zniteli\u011fi <code>Ayarlar<\/code> nesnesinde do\u011frudan tan\u0131ml\u0131 olmamas\u0131na ra\u011fmen, <code>__getattr__<\/code> sayesinde bir hata yerine varsay\u0131lan bir de\u011fer d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/p>\n<h3><code>AttributeError<\/code> Y\u00f6netimi<\/h3>\n<p>E\u011fer <code>__getattr__<\/code> y\u00f6ntemi de istenen \u00f6zniteli\u011fi bulamaz veya olu\u015fturamazsa, bir <code>AttributeError<\/code> y\u00fckseltmelidir. Bu, Python'\u0131n beklenen davran\u0131\u015f\u0131d\u0131r ve kodunuzun tutarl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2><code>__setattr__<\/code> ile \u00d6znitelik Atamalar\u0131n\u0131 Kontrol Etme<\/h2>\n<p><code>__setattr__(self, name, value)<\/code> y\u00f6ntemi, bir nesnenin \u00f6zniteli\u011fine de\u011fer atand\u0131\u011f\u0131nda (yani <code>obj.attr = value<\/code> ifadesi kullan\u0131ld\u0131\u011f\u0131nda) otomatik olarak \u00e7a\u011fr\u0131l\u0131r. Bu y\u00f6ntem, atanan de\u011ferleri do\u011frulamak, d\u00f6n\u00fc\u015ft\u00fcrmek veya atama i\u015flemini tamamen engellemek i\u00e7in kullan\u0131labilir.<\/p>\n<h3><code>__setattr__<\/code> Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p><code>__setattr__<\/code>, bir \u00f6zniteli\u011fe de\u011fer atand\u0131\u011f\u0131 <em>her seferinde<\/em> tetiklenir, \u00f6zniteli\u011fin daha \u00f6nce var olup olmamas\u0131 fark etmeksizin. Bu, \u00f6znitelik atamas\u0131 \u00fczerinde tam kontrol sa\u011flar.<\/p>\n<h3>De\u011fer Do\u011frulama ve D\u00f6n\u00fc\u015ft\u00fcrme<\/h3>\n<p>Bu y\u00f6ntem, bir \u00f6zniteli\u011fe atanan de\u011ferlerin belirli kriterleri kar\u015f\u0131lay\u0131p kar\u015f\u0131lamad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in m\u00fckemmeldir. \u00d6rne\u011fin, bir ya\u015f \u00f6zniteli\u011finin negatif olmamas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<pre><code class=\"language-python\">class Kisi:\n    def __init__(self, ad, yas):\n        self.ad = ad # Bu atama da __setattr__'\u0131 tetikler\n        self.yas = yas # Bu atama da __setattr__'\u0131 tetikler\n\n    def __setattr__(self, name, value):\n        if name == \"yas\":\n            if not isinstance(value, int) or value < 0:\n                raise ValueError(\"Ya\u015f pozitif bir tam say\u0131 olmal\u0131d\u0131r.\")\n        # \u00d6nemli: Sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nmak i\u00e7in super().__setattr__ kullan\u0131n!\n        super().__setattr__(name, value)\n\np = Kisi(\"Ali\", 30)\nprint(p.ad, p.yas) # Ali 30\n\ntry:\n    p.yas = -5\nexcept ValueError as e:\n    print(e) # Ya\u015f pozitif bir tam say\u0131 olmal\u0131d\u0131r.\n\ntry:\n    p.yas = \"otuz\"\nexcept ValueError as e:\n    print(e) # Ya\u015f pozitif bir tam say\u0131 olmal\u0131d\u0131r.\n<\/pre>\n<p><\/code><\/p>\n<h3>Sonsuz D\u00f6ng\u00fcden Ka\u00e7\u0131nma<\/h3>\n<p><code>__setattr__<\/code> i\u00e7inde <code>self.name = value<\/code> gibi do\u011frudan bir atama yapmak sonsuz bir d\u00f6ng\u00fcye yol a\u00e7ar, \u00e7\u00fcnk\u00fc bu ifade tekrar <code>__setattr__<\/code>'\u0131 tetikler. Bu durumu \u00f6nlemek i\u00e7in, atama i\u015flemini ger\u00e7ekle\u015ftirmek i\u00e7in mutlaka \u00fcst s\u0131n\u0131f\u0131n (<code>object<\/code> s\u0131n\u0131f\u0131n\u0131n) <code>__setattr__<\/code> y\u00f6ntemini \u00e7a\u011f\u0131rmal\u0131s\u0131n\u0131z: <code>super().__setattr__(name, value)<\/code> veya do\u011frudan nesnenin <code>__dict__<\/code>'ine eri\u015ferek <code>self.__dict__[name] = value<\/code> kullanmal\u0131s\u0131n\u0131z. Genellikle <code>super()<\/code> kullan\u0131m\u0131 tercih edilir.<\/p>\n<h2><code>__delattr__<\/code> ile \u00d6znitelik Silme \u0130\u015flemlerini \u00d6zelle\u015ftirme<\/h2>\n<p><code>__delattr__(self, name)<\/code> y\u00f6ntemi, bir nesnenin \u00f6zniteli\u011fi <code>del<\/code> anahtar kelimesi kullan\u0131larak silinmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. Bu, kaynak temizli\u011fi yapmak, silme i\u015flemini engellemek veya belirli yan etkileri y\u00f6netmek i\u00e7in kullan\u0131labilir.<\/p>\n<h3><code>del<\/code> Anahtar Kelimesi ve <code>__delattr__<\/code><\/h3>\n<p>Bir \u00f6zniteli\u011fi silmek i\u00e7in <code>del obj.attr<\/code> syntax'\u0131n\u0131 kullan\u0131r\u0131z. Bu ifade, Python yorumlay\u0131c\u0131s\u0131 taraf\u0131ndan <code>obj.__delattr__('attr')<\/code> \u00e7a\u011fr\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr.<\/p>\n<h3>Kaynak Temizli\u011fi ve Yan Etkiler<\/h3>\n<p>Baz\u0131 durumlarda, bir \u00f6zniteli\u011fin silinmesiyle birlikte ili\u015fkili kaynaklar\u0131n (dosya tan\u0131t\u0131c\u0131lar\u0131, veritaban\u0131 ba\u011flant\u0131lar\u0131 vb.) da temizlenmesi gerekebilir. <code>__delattr__<\/code> bu t\u00fcr temizlik i\u015flemlerini otomatikle\u015ftirmek i\u00e7in uygun bir yerdir.<\/p>\n<pre><code class=\"language-python\">class KaynakYoneticisi:\n    def __init__(self, dosya_adi):\n        self.dosya_adi = dosya_adi\n        self._acik_kaynaklar = {}\n\n    def __setattr__(self, name, value):\n        if name == \"dosya_adi\" and hasattr(self, \"dosya_adi\"):\n            print(f\"Uyar\u0131: '{self.dosya_adi}' dosyas\u0131 de\u011fi\u015ftiriliyor. Eski kaynaklar kapat\u0131lmal\u0131.\")\n            # Ger\u00e7ek bir senaryoda burada eski kaynaklar\u0131 kapatma mant\u0131\u011f\u0131 olurdu.\n        super().__setattr__(name, value)\n\n    def __delattr__(self, name):\n        if name in self._acik_kaynaklar:\n            print(f\"'{name}' ile ili\u015fkili kaynak kapat\u0131l\u0131yor...\")\n            # Burada kayna\u011f\u0131 kapatma mant\u0131\u011f\u0131 olurdu\n            del self._acik_kaynaklar[name]\n        elif name == \"dosya_adi\":\n            print(f\"'{self.dosya_adi}' \u00f6zniteli\u011fi siliniyor. \u0130li\u015fkili dosya referans\u0131 kald\u0131r\u0131ld\u0131.\")\n        \n        # Sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nmak i\u00e7in \u00fcst s\u0131n\u0131f\u0131n y\u00f6ntemini \u00e7a\u011f\u0131r\u0131n\n        super().__delattr__(name)\n\nr = KaynakYoneticisi(\"log.txt\")\nr._acik_kaynaklar[\"veritabani_baglantisi\"] = \"baglanti_nesnesi\" # \u00d6rnek bir kaynak\n\ndel r.dosya_adi # 'dosya_adi' \u00f6zniteli\u011fi siliniyor...\ndel r._acik_kaynaklar[\"veritabani_baglantisi\"] # 'veritabani_baglantisi' ile ili\u015fkili kaynak kapat\u0131l\u0131yor...\n\ntry:\n    del r.mevcut_olmayan\nexcept AttributeError as e:\n    print(e) # mevcut_olmayan\n<\/pre>\n<p><\/code><\/p>\n<h3>Silme \u0130\u015flemini Engelleme<\/h3>\n<p>Belirli \u00f6zniteliklerin silinmesini tamamen engellemek i\u00e7in <code>__delattr__<\/code> i\u00e7inde bir <code>AttributeError<\/code> y\u00fckseltebilirsiniz.<\/p>\n<pre><code class=\"language-python\">class SabitNesne:\n    def __init__(self, id):\n        self.id = id\n        self.olusturma_tarihi = \"Bug\u00fcn\"\n\n    def __delattr__(self, name):\n        if name == \"id\":\n            raise AttributeError(f\"'{name}' \u00f6zniteli\u011fi silinemez.\")\n        super().__delattr__(name)\n\ns = SabitNesne(123)\ntry:\n    del s.id\nexcept AttributeError as e:\n    print(e) # 'id' \u00f6zniteli\u011fi silinemez.\n\ndel s.olusturma_tarihi # Bu i\u015flem ba\u015far\u0131l\u0131 olur.\n<\/pre>\n<p><\/code><\/p>\n<h2><code>__getattribute__<\/code> ve Her Eri\u015fimde Derinlemesine Kontrol<\/h2>\n<p><code>__getattribute__(self, name)<\/code> y\u00f6ntemi, bir nesnenin \u00f6zniteli\u011fine eri\u015fildi\u011fi <em>her seferinde<\/em> \u00e7a\u011fr\u0131l\u0131r. Bu, <code>__getattr__<\/code>'dan farkl\u0131 olarak, \u00f6znitelik mevcut olsa bile tetiklenir. Bu y\u00f6ntem, \u00f6znitelik eri\u015fimi \u00fczerinde en y\u00fcksek d\u00fczeyde kontrol sa\u011flar.<\/p>\n<h3><code>__getattr__<\/code> ile <code>__getattribute__<\/code> Aras\u0131ndaki Fark<\/h3>\n<p>Bu iki y\u00f6ntem aras\u0131ndaki temel fark \u00e7ok \u00f6nemlidir:<\/p>\n<ul>\n<li><code>__getattr__<\/code>: Yaln\u0131zca eri\u015filmeye \u00e7al\u0131\u015f\u0131lan \u00f6znitelik <strong>bulunamad\u0131\u011f\u0131nda<\/strong> \u00e7a\u011fr\u0131l\u0131r.<\/li>\n<li><code>__getattribute__<\/code>: Eri\u015filmeye \u00e7al\u0131\u015f\u0131lan \u00f6znitelik <strong>her zaman<\/strong> \u00e7a\u011fr\u0131l\u0131r, ister mevcut olsun ister olmas\u0131n.<\/li>\n<\/ul>\n<p>Bu fark, <code>__getattribute__<\/code>'\u0131 \u00e7ok g\u00fc\u00e7l\u00fc ancak ayn\u0131 zamanda potansiyel olarak tehlikeli k\u0131lar. Yanl\u0131\u015f kullan\u0131l\u0131rsa, sonsuz d\u00f6ng\u00fclere veya beklenmedik davran\u0131\u015flara yol a\u00e7abilir.<\/p>\n<h3>Her \u00d6znitelik Eri\u015fimini Yakalama<\/h3>\n<p><code>__getattribute__<\/code> kullanarak, bir \u00f6zniteli\u011fe eri\u015filmeden \u00f6nce veya sonra ek mant\u0131k ekleyebiliriz. \u00d6rne\u011fin, bir \u00f6zniteli\u011fin de\u011ferini loglayabilir, \u00f6nbelle\u011fe alabilir veya dinamik olarak de\u011fi\u015ftirebiliriz.<\/p>\n<pre><code class=\"language-python\">class LoggerNesnesi:\n    def __init__(self, deger):\n        self.deger = deger\n        self.sayac = 0\n\n    def __getattribute__(self, name):\n        # Sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nmak i\u00e7in \u00fcst s\u0131n\u0131f\u0131n __getattribute__ y\u00f6ntemini kullan\u0131n!\n        # Do\u011frudan self.deger veya self.sayac eri\u015fimi burada sonsuz d\u00f6ng\u00fcye yol a\u00e7ar.\n        print(f\"'{name}' \u00f6zniteli\u011fine eri\u015filiyor...\")\n        if name == \"sayac\":\n            # Sayac\u0131 her eri\u015fimde art\u0131r\n            # Bu, super().__setattr__ ile yap\u0131lmal\u0131d\u0131r\n            current_count = super().__getattribute__(\"sayac\")\n            super().__setattr__(\"sayac\", current_count + 1)\n        \n        return super().__getattribute__(name)\n\nl = LoggerNesnesi(100)\nprint(l.deger) # 'deger' \u00f6zniteli\u011fine eri\u015filiyor... 100\nprint(l.sayac) # 'sayac' \u00f6zniteli\u011fine eri\u015filiyor... 0 (ilk eri\u015fimde 0 d\u00f6ner, sonra 1 olur)\nprint(l.sayac) # 'sayac' \u00f6zniteli\u011fine eri\u015filiyor... 1 (ikinci eri\u015fimde 1 d\u00f6ner, sonra 2 olur)\n<\/pre>\n<p><\/code><\/p>\n<h3>Sonsuz D\u00f6ng\u00fcden Ka\u00e7\u0131nma ve <code>super()<\/code> Kullan\u0131m\u0131<\/h3>\n<p><code>__setattr__<\/code>'da oldu\u011fu gibi, <code>__getattribute__<\/code> i\u00e7inde de dikkatli olmak gerekir. E\u011fer <code>self.name<\/code> gibi do\u011frudan bir \u00f6znitelik eri\u015fimi yaparsan\u0131z, bu tekrar <code>__getattribute__<\/code>'\u0131 tetikleyerek sonsuz bir d\u00f6ng\u00fcye yol a\u00e7ar. Bu nedenle, \u00f6zniteliklere g\u00fcvenli bir \u015fekilde eri\u015fmek i\u00e7in <code>super().__getattribute__(name)<\/code> kullanmal\u0131s\u0131n\u0131z. Bu, \u00fcst s\u0131n\u0131f\u0131n (genellikle <code>object<\/code>'in) varsay\u0131lan \u00f6znitelik eri\u015fim mekanizmas\u0131n\u0131 \u00e7a\u011f\u0131r\u0131r ve d\u00f6ng\u00fcy\u00fc \u00f6nler.<\/p>\n<h2>Dikkat Edilmesi Gerekenler ve Yayg\u0131n Hatalar<\/h2>\n<p>\u00d6znitelik eri\u015fimini \u00f6zelle\u015ftirmek g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, beraberinde baz\u0131 sorumluluklar ve potansiyel tuzaklar getirir. Bu y\u00f6ntemleri kullan\u0131rken dikkatli olmak, kodunuzun performans\u0131n\u0131 ve okunabilirli\u011fini korumak i\u00e7in \u00f6nemlidir.<\/p>\n<h3>Performans Etkileri<\/h3>\n<p>Her \u00f6znitelik eri\u015fiminde veya atamas\u0131nda \u00f6zel bir metodun \u00e7a\u011fr\u0131lmas\u0131, do\u011fal olarak performans maliyeti getirir. \u00d6zellikle <code>__getattribute__<\/code>, her eri\u015fimde tetiklendi\u011fi i\u00e7in yo\u011fun kullan\u0131ld\u0131\u011f\u0131nda performans d\u00fc\u015f\u00fc\u015flerine neden olabilir. Bu nedenle, bu y\u00f6ntemleri yaln\u0131zca ger\u00e7ekten ihtiya\u00e7 duydu\u011funuzda ve performans etkilerini g\u00f6z \u00f6n\u00fcnde bulundurarak kullanmal\u0131s\u0131n\u0131z.<\/p>\n<h3>Kod Karma\u015f\u0131kl\u0131\u011f\u0131<\/h3>\n<p>\u00d6znitelik eri\u015fimini \u00f6zelle\u015ftiren s\u0131n\u0131flar, varsay\u0131lan davran\u0131\u015fa sahip s\u0131n\u0131flara g\u00f6re daha karma\u015f\u0131k ve anla\u015f\u0131lmas\u0131 zor olabilir. Bu \"magic methods\"\u0131n arkas\u0131ndaki mant\u0131k net bir \u015fekilde belgelenmezse, di\u011fer geli\u015ftiricilerin kodu anlamas\u0131 ve bak\u0131m\u0131n\u0131 yapmas\u0131 zorla\u015fabilir. A\u015f\u0131r\u0131ya ka\u00e7maktan ka\u00e7\u0131n\u0131n ve basit \u00e7\u00f6z\u00fcmlerin yeterli oldu\u011fu yerlerde bu y\u00f6ntemleri kullanmaktan sak\u0131n\u0131n.<\/p>\n<h3><code>__dict__<\/code> ile Etkile\u015fim<\/h3>\n<p>Python nesnelerinin \u00f6znitelikleri genellikle <code>__dict__<\/code> s\u00f6zl\u00fc\u011f\u00fcnde saklan\u0131r. <code>__setattr__<\/code> ve <code>__delattr__<\/code> i\u00e7inde do\u011frudan <code>self.__dict__[name] = value<\/code> veya <code>del self.__dict__[name]<\/code> kullanarak \u00f6znitelikleri y\u00f6netebilirsiniz. Ancak, genellikle <code>super().__setattr__(name, value)<\/code> gibi <code>super()<\/code> kullan\u0131m\u0131 tercih edilir, \u00e7\u00fcnk\u00fc bu daha genel bir yakla\u015f\u0131md\u0131r ve miras alma durumlar\u0131nda daha do\u011fru \u00e7al\u0131\u015f\u0131r. <code>__getattribute__<\/code> i\u00e7inde de <code>self.__dict__[name]<\/code> yerine <code>super().__getattribute__(name)<\/code> kullanmak, sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h2>Pratik Uygulamalar ve Kullan\u0131m Senaryolar\u0131<\/h2>\n<p>\u00d6znitelik eri\u015fimini \u00f6zelle\u015ftirme yetene\u011fi, Python'da \u00e7e\u015fitli g\u00fc\u00e7l\u00fc ve esnek tasar\u0131m desenleri olu\u015fturmak i\u00e7in kullan\u0131labilir. \u0130\u015fte baz\u0131 yayg\u0131n kullan\u0131m senaryolar\u0131:<\/p>\n<h3>Proxy Nesneleri Olu\u015fturma<\/h3>\n<p>Bir proxy nesnesi, ba\u015fka bir nesneye yap\u0131lan eri\u015fimleri kontrol eden bir arac\u0131d\u0131r. \u00d6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 tembelce (lazy) y\u00fcklemek veya bir uzak hizmete yap\u0131lan \u00e7a\u011fr\u0131lar\u0131 y\u00f6netmek i\u00e7in <code>__getattr__<\/code> ve <code>__setattr__<\/code> kullan\u0131labilir. Bu sayede, ger\u00e7ek nesneye yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda eri\u015filir.<\/p>\n<pre><code class=\"language-python\">class TembelYuklenenVeri:\n    def __init__(self, veri_kaynagi_fonksiyonu):\n        self._veri_kaynagi = veri_kaynagi_fonksiyonu\n        self._gercek_veri = None\n\n    def __getattr__(self, name):\n        if self._gercek_veri is None:\n            print(\"Veri kayna\u011f\u0131 y\u00fckleniyor...\")\n            self._gercek_veri = self._veri_kaynagi()\n        return getattr(self._gercek_veri, name)\n\n    def __setattr__(self, name, value):\n        if name == \"_veri_kaynagi\" or name == \"_gercek_veri\":\n            super().__setattr__(name, value)\n        else:\n            if self._gercek_veri is None:\n                print(\"Veri kayna\u011f\u0131 y\u00fckleniyor (atamadan \u00f6nce)...\")\n                self._gercek_veri = self._veri_kaynagi()\n            setattr(self._gercek_veri, name, value)\n\ndef buyuk_veri_seti_olustur():\n    print(\"B\u00fcy\u00fck veri seti olu\u015fturuluyor...\")\n    return {\"ad\": \"Mehmet\", \"yas\": 40, \"sehir\": \"Ankara\"}\n\nveri = TembelYuklenenVeri(buyuk_veri_seti_olust)\nprint(\"Nesne olu\u015fturuldu, hen\u00fcz veri y\u00fcklenmedi.\")\nprint(veri.ad) # \u0130lk eri\u015fimde y\u00fcklenir: \"Mehmet\"\nveri.sehir = \"\u0130stanbul\" # Atamada da y\u00fcklenir\nprint(veri.sehir) # \"\u0130stanbul\"\n<\/pre>\n<p><\/code><\/p>\n<h3>Veri Do\u011frulama Katmanlar\u0131<\/h3>\n<p><code>__setattr__<\/code>, bir nesnenin \u00f6zniteliklerine atanan de\u011ferlerin belirli kurallara uygunlu\u011funu sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r. Daha \u00f6nce g\u00f6sterildi\u011fi gibi, ya\u015f\u0131n pozitif bir tam say\u0131 olmas\u0131 gibi basit kontrollerden, karma\u015f\u0131k i\u015f kurallar\u0131na kadar her t\u00fcrl\u00fc do\u011frulama yap\u0131labilir.<\/p>\n<h3>ORM'ler ve Dinamik Model Alanlar\u0131<\/h3>\n<p>Object-Relational Mapping (ORM) k\u00fct\u00fcphaneleri (Django ORM, SQLAlchemy gibi), veritaban\u0131 tablolar\u0131n\u0131 Python s\u0131n\u0131flar\u0131 olarak temsil eder. Bu k\u00fct\u00fcphaneler, veritaban\u0131 s\u00fctunlar\u0131na kar\u015f\u0131l\u0131k gelen model \u00f6zniteliklerini dinamik olarak y\u00f6netmek i\u00e7in s\u0131kl\u0131kla <code>__getattr__<\/code>, <code>__setattr__<\/code> ve <code>__getattribute__<\/code> gibi y\u00f6ntemleri kullan\u0131r. \u00d6rne\u011fin, bir model nesnesinin bir \u00f6zniteli\u011fine eri\u015fildi\u011finde, bu \u00f6znitelik veritaban\u0131ndan \u00e7ekilebilir veya bir sorgu olu\u015fturulabilir.<\/p>\n<p>Tablo: \u00d6znitelik Eri\u015fim Y\u00f6ntemlerinin Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/p>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Y\u00f6ntem<\/th>\n<th>Ne Zaman Tetiklenir?<\/th>\n<th>Kullan\u0131m Alan\u0131<\/th>\n<th>Dikkat Edilmesi Gerekenler<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>__getattr__<\/code><\/td>\n<td>\u00d6znitelik bulunamad\u0131\u011f\u0131nda (son \u00e7are)<\/td>\n<td>Dinamik \u00f6znitelikler, varsay\u0131lan de\u011ferler, tembel y\u00fckleme<\/td>\n<td>Performans etkisi d\u00fc\u015f\u00fckt\u00fcr, sadece hata durumunda \u00e7al\u0131\u015f\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><code>__setattr__<\/code><\/td>\n<td>Her \u00f6znitelik atamas\u0131nda<\/td>\n<td>De\u011fer do\u011frulama, d\u00f6n\u00fc\u015ft\u00fcrme, atamay\u0131 engelleme<\/td>\n<td>Sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nmak i\u00e7in <code>super().__setattr__<\/code> kullan\u0131n.<\/td>\n<\/tr>\n<tr>\n<td><code>__delattr__<\/code><\/td>\n<td><code>del obj.attr<\/code> ile \u00f6znitelik silindi\u011finde<\/td>\n<td>Kaynak temizli\u011fi, silmeyi engelleme<\/td>\n<td>Sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nmak i\u00e7in <code>super().__delattr__<\/code> kullan\u0131n.<\/td>\n<\/tr>\n<tr>\n<td><code>__getattribute__<\/code><\/td>\n<td>Her \u00f6znitelik eri\u015fiminde (ilk \u00e7a\u011fr\u0131lan)<\/td>\n<td>T\u00fcm eri\u015fimlerin loglanmas\u0131, \u00f6nbellekleme, proxy'ler<\/td>\n<td>Performans etkisi y\u00fcksektir, sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nmak i\u00e7in <code>super().__getattribute__<\/code> kullan\u0131n.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Sonu\u00e7<\/h2>\n<p>Python'da \u00f6znitelik eri\u015fimini \u00f6zelle\u015ftirmek, dilin dinamik g\u00fcc\u00fcn\u00fc ve esnekli\u011fini en \u00fcst d\u00fczeyde kullanman\u0131z\u0131 sa\u011flayan ileri d\u00fczey bir konudur. <code>__getattr__<\/code>, <code>__setattr__<\/code>, <code>__delattr__<\/code> ve <code>__getattribute__<\/code> gibi \u00f6zel y\u00f6ntemler, s\u0131n\u0131flar\u0131n\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 derinlemesine kontrol etme, veri do\u011frulama, dinamik \u00f6znitelikler olu\u015fturma ve hatta karma\u015f\u0131k proxy desenleri uygulama imkan\u0131 sunar. Ancak, bu g\u00fc\u00e7le birlikte b\u00fcy\u00fck bir sorumluluk da gelir. Bu y\u00f6ntemlerin yanl\u0131\u015f veya a\u015f\u0131r\u0131 kullan\u0131m\u0131, kodun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 art\u0131rabilir, performans sorunlar\u0131na yol a\u00e7abilir ve beklenmedik davran\u0131\u015flara neden olabilir. Bu nedenle, onlar\u0131 dikkatli, bilin\u00e7li ve yaln\u0131zca ger\u00e7ekten ihtiya\u00e7 duydu\u011funuzda kullanman\u0131z \u00f6nemlidir. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, bu \"magic methods\" Python programlar\u0131n\u0131z\u0131 daha sa\u011flam, esnek ve etkileyici hale getirebilir.<\/p>\n<h2>SSS (S\u0131k Sorulan Sorular)<\/h2>\n<h3>1. <code>__getattr__<\/code> ve <code>__getattribute__<\/code> aras\u0131ndaki temel fark nedir?<\/h3>\n<p><code>__getattr__<\/code>, yaln\u0131zca eri\u015filmeye \u00e7al\u0131\u015f\u0131lan \u00f6znitelik nesnede bulunamad\u0131\u011f\u0131nda \u00e7a\u011fr\u0131l\u0131r. <code>__getattribute__<\/code> ise, \u00f6znitelik mevcut olsa bile, bir \u00f6zniteli\u011fe eri\u015fildi\u011fi <em>her seferinde<\/em> \u00e7a\u011fr\u0131lan ilk y\u00f6ntemdir. Bu nedenle <code>__getattribute__<\/code> daha geni\u015f bir kontrol sa\u011flar ancak daha dikkatli kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h3>2. Sonsuz d\u00f6ng\u00fc hatas\u0131n\u0131 nas\u0131l \u00f6nleyebilirim?<\/h3>\n<p><code>__setattr__<\/code> ve <code>__getattribute__<\/code> i\u00e7inde, \u00f6zniteliklere eri\u015fmek veya atamak i\u00e7in do\u011frudan <code>self.attr = value<\/code> veya <code>self.attr<\/code> kullanmaktan ka\u00e7\u0131nmal\u0131s\u0131n\u0131z. Bunun yerine, \u00fcst s\u0131n\u0131f\u0131n (genellikle <code>object<\/code>) varsay\u0131lan davran\u0131\u015f\u0131n\u0131 \u00e7a\u011f\u0131rmak i\u00e7in <code>super().__setattr__(name, value)<\/code> ve <code>super().__getattribute__(name)<\/code> kullanmal\u0131s\u0131n\u0131z. Bu, d\u00f6ng\u00fcy\u00fc k\u0131rar ve g\u00fcvenli bir \u015fekilde \u00f6znitelik i\u015flemlerini ger\u00e7ekle\u015ftirmenizi sa\u011flar.<\/p>\n<h3>3. Bu y\u00f6ntemleri ne zaman kullanmal\u0131y\u0131m?<\/h3>\n<p>Bu y\u00f6ntemler, dinamik davran\u0131\u015flar gerekti\u011finde, \u00f6rne\u011fin:<\/p>\n<ul>\n<li>Bir \u00f6zniteli\u011fe eri\u015fildi\u011finde tembel y\u00fckleme yapmak (<code>__getattr__<\/code>, <code>__getattribute__<\/code>)<\/li>\n<li>\u00d6znitelik de\u011ferlerini atamadan \u00f6nce do\u011frulamak veya d\u00f6n\u00fc\u015ft\u00fcrmek (<code>__setattr__<\/code>)<\/li>\n<li>Proxy nesneleri olu\u015fturmak veya bir API'yi sarmalamak (<code>__getattr__<\/code>, <code>__getattribute__<\/code>, <code>__setattr__<\/code>)<\/li>\n<li>Bir \u00f6zniteli\u011fin silinmesini engellemek veya silme an\u0131nda ek i\u015flemler yapmak (<code>__delattr__<\/code>)<\/li>\n<li>T\u00fcm \u00f6znitelik eri\u015fimlerini loglamak veya izlemek (<code>__getattribute__<\/code>)<\/li>\n<\/ul>\n<p>gibi durumlarda kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>4. Performans \u00fczerindeki etkisi nedir?<\/h3>\n<p>Bu \u00f6zel y\u00f6ntemlerin her \u00e7a\u011fr\u0131s\u0131, standart \u00f6znitelik eri\u015fimine g\u00f6re ek bir maliyet getirir. \u00d6zellikle <code>__getattribute__<\/code>, her \u00f6znitelik eri\u015fiminde tetiklendi\u011fi i\u00e7in performans \u00fczerinde belirgin bir etkiye sahip olabilir. Bu nedenle, performans kritik uygulamalarda bu y\u00f6ntemleri kullan\u0131rken dikkatli olmal\u0131 ve alternatif \u00e7\u00f6z\u00fcmleri de\u011ferlendirmelisiniz.<\/p>\n<h3>5. <code>__slots__<\/code> ile ili\u015fkisi var m\u0131?<\/h3>\n<p>Evet, <code>__slots__<\/code> bir s\u0131n\u0131f\u0131n <code>__dict__<\/code>'ini kald\u0131rarak veya s\u0131n\u0131rlayarak bellek kullan\u0131m\u0131n\u0131 optimize etmeye yarar. <code>__slots__<\/code> tan\u0131mlanm\u0131\u015f bir s\u0131n\u0131fta, \u00f6znitelik atamalar\u0131 ve eri\u015fimleri do\u011frudan <code>__slots__<\/code> i\u00e7inde belirtilen isimlere y\u00f6nlendirilir. E\u011fer <code>__slots__<\/code> kullan\u0131yorsan\u0131z ve bir \u00f6zniteli\u011fe eri\u015fmeye \u00e7al\u0131\u015f\u0131rsan\u0131z, Python \u00f6nce <code>__slots__<\/code>'a bakar. E\u011fer \u00f6znitelik orada yoksa ve <code>__getattribute__<\/code> tan\u0131ml\u0131ysa o \u00e7a\u011fr\u0131l\u0131r. E\u011fer <code>__getattribute__<\/code> tan\u0131ml\u0131 de\u011filse, Python bir <code>AttributeError<\/code> y\u00fckseltir (<code>__dict__<\/code> olmad\u0131\u011f\u0131 i\u00e7in <code>__getattr__<\/code> tetiklenmez, ancak <code>__slots__<\/code> i\u00e7inde <code>'__dict__'<\/code> belirtilirse durum de\u011fi\u015fir). <code>__setattr__<\/code> ve <code>__delattr__<\/code> ise <code>__slots__<\/code> ile birlikte de sorunsuz \u00e7al\u0131\u015f\u0131r, ancak yine sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nmak i\u00e7in <code>super()<\/code> kullan\u0131m\u0131 \u00f6nemlidir.<\/p>\n","protected":false},"excerpt":{"rendered":"Python, esnekli\u011fi ve dinamik yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan bir programlama dilidir. Bu esnekli\u011fin \u00f6nemli bir par\u00e7as\u0131 da nesne \u00f6zniteliklerine (attribute) eri\u015fim ve bu eri\u015fimin nas\u0131l y\u00f6netilece\u011fidir.","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-40702","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>Quark&#039;\u0131n Ana Hatlar\u0131: Python&#039;da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131 - 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\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Quark&#039;\u0131n Ana Hatlar\u0131: Python&#039;da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131\" \/>\n<meta property=\"og:description\" content=\"Python, esnekli\u011fi ve dinamik yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan bir programlama dilidir. Bu esnekli\u011fin \u00f6nemli bir par\u00e7as\u0131 da nesne \u00f6zniteliklerine (attribute) eri\u015fim ve bu eri\u015fimin nas\u0131l y\u00f6netilece\u011fidir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-28T12:30:42+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=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Quark&#8217;\u0131n Ana Hatlar\u0131: Python&#8217;da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131\",\"datePublished\":\"2026-02-28T12:30:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/\"},\"wordCount\":2292,\"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\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/\",\"name\":\"Quark'\u0131n Ana Hatlar\u0131: Python'da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-28T12:30:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quark&#8217;\u0131n Ana Hatlar\u0131: Python&#8217;da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131\"}]},{\"@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":"Quark'\u0131n Ana Hatlar\u0131: Python'da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131 - 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\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/","og_locale":"tr_TR","og_type":"article","og_title":"Quark'\u0131n Ana Hatlar\u0131: Python'da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131","og_description":"Python, esnekli\u011fi ve dinamik yap\u0131s\u0131yla \u00f6ne \u00e7\u0131kan bir programlama dilidir. Bu esnekli\u011fin \u00f6nemli bir par\u00e7as\u0131 da nesne \u00f6zniteliklerine (attribute) eri\u015fim ve bu eri\u015fimin nas\u0131l y\u00f6netilece\u011fidir.","og_url":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-28T12:30:42+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Quark&#8217;\u0131n Ana Hatlar\u0131: Python&#8217;da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131","datePublished":"2026-02-28T12:30:42+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/"},"wordCount":2292,"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\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/","url":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/","name":"Quark'\u0131n Ana Hatlar\u0131: Python'da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-28T12:30:42+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/quarkin-ana-hatlari-pythonda-oznitelik-erisimini-ozellestirme-sanati\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Quark&#8217;\u0131n Ana Hatlar\u0131: Python&#8217;da \u00d6znitelik Eri\u015fimini \u00d6zelle\u015ftirme Sanat\u0131"}]},{"@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\/40702","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=40702"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40702\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=40702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=40702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=40702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}