{"id":32078,"date":"2025-10-17T12:31:35","date_gmt":"2025-10-17T09:31:35","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/"},"modified":"2025-10-17T12:31:35","modified_gmt":"2025-10-17T09:31:35","slug":"python-decoratorlari-fonksiyonlari-guclendirmenin-yolu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/","title":{"rendered":"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu"},"content":{"rendered":"<p><body><\/p>\n<p>Python programlama dilinde kodunuzu daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay hale getirmenin yollar\u0131n\u0131 m\u0131 ar\u0131yorsunuz? \u00d6zellikle s\u00fcrekli tekrar eden g\u00f6revler, \u00f6rne\u011fin loglama, yetkilendirme veya bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7me gibi durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, kod tekrar\u0131n\u0131 nas\u0131l minimuma indirece\u011finizi merak ediyor olabilirsiniz. \u0130\u015fte bu noktada Python decorator&#8217;lar\u0131 devreye giriyor. Decorator&#8217;lar, mevcut fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftiren veya geni\u015fleten, ayn\u0131 zamanda kodun kendisini de\u011fi\u015ftirmek zorunda kalmadan yeni i\u015flevsellik eklemenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir metaprogramlama arac\u0131d\u0131r. Bu makalede, Python decorator&#8217;lar\u0131n\u0131n temellerinden ileri d\u00fczey kullan\u0131mlar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan kar\u015f\u0131la\u015fabilece\u011finiz zorluklara kadar her \u015feyi detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ad\u0131m ad\u0131m \u00f6rneklerle, decorator&#8217;lar\u0131n g\u00fcc\u00fcn\u00fc ve esnekli\u011fini ke\u015ffedece\u011fiz.<\/p>\n<h2>Python Decoratorlar\u0131 Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h2>\n<p>Python decorator&#8217;lar\u0131, temel olarak, ba\u015fka bir fonksiyonu arg\u00fcman olarak alan, onun davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftiren ve yeni bir fonksiyon d\u00f6nd\u00fcren fonksiyonlard\u0131r. Bu tan\u0131m ba\u015flang\u0131\u00e7ta biraz soyut gelebilir, ancak ard\u0131ndaki kavramlar Python&#8217;\u0131n esnek yap\u0131s\u0131na dayan\u0131r: fonksiyonlar birinci s\u0131n\u0131f nesnelerdir. Yani, Python&#8217;da fonksiyonlar\u0131 de\u011fi\u015fkenlere atayabilir, ba\u015fka fonksiyonlara arg\u00fcman olarak ge\u00e7irebilir ve fonksiyonlardan de\u011fer olarak d\u00f6nd\u00fcrebilirsiniz. Decorator&#8217;lar da tam olarak bu yetenekleri kullanarak metaprogramlama, yani kodun kod \u00fczerinde i\u015flem yapmas\u0131 prensibini hayata ge\u00e7irir.<\/p>\n<p>Decorator&#8217;lar\u0131n ard\u0131ndaki temel yap\u0131 ta\u015flar\u0131 aras\u0131nda <strong>i\u00e7 i\u00e7e fonksiyonlar (nested functions)<\/strong> ve <strong>kapatmalar (closures)<\/strong> bulunur. \u0130\u00e7 i\u00e7e fonksiyonlar, bir fonksiyonun i\u00e7inde ba\u015fka bir fonksiyon tan\u0131mlaman\u0131za olanak tan\u0131r. Kapatmalar ise, i\u00e7 fonksiyonun d\u0131\u015f fonksiyonun kapsam\u0131ndaki de\u011fi\u015fkenlere eri\u015fmeye devam etmesini sa\u011flar, hatta d\u0131\u015f fonksiyonun \u00e7al\u0131\u015fmas\u0131 bitmi\u015f olsa bile. Bir decorator, genellikle bu yap\u0131y\u0131 kullanarak hedef fonksiyonu &#8220;saran&#8221; (wrap) bir i\u00e7 fonksiyon tan\u0131mlar. Bu sarmalama i\u015flemi, hedef fonksiyonun \u00e7al\u0131\u015fmas\u0131ndan \u00f6nce veya sonra ek i\u015flemler yapma imkan\u0131 tan\u0131r.<\/p>\n<p>Peki, decorator&#8217;lar\u0131 neden kullanmal\u0131y\u0131z? Cevap, esasen kod tekrar\u0131n\u0131 azaltmak (DRY &#8211; Don&#8217;t Repeat Yourself prensibi), mod\u00fclerli\u011fi art\u0131rmak ve fonksiyonlara yan etki eklemek gibi ihtiya\u00e7lardan kaynaklan\u0131r. \u00d6rne\u011fin, bir web uygulamas\u0131nda belirli bir sayfa eri\u015fiminin sadece oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar taraf\u0131ndan yap\u0131lmas\u0131n\u0131 istiyorsunuz. Bu kontrol\u00fc her sayfa fonksiyonunun ba\u015f\u0131na yazmak yerine, bir &#8220;login_required&#8221; decorator&#8217;\u0131 olu\u015fturup ilgili fonksiyonlara uygulayabilirsiniz. Benzer \u015fekilde, bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7mek, veritaban\u0131 i\u015flemlerini loglamak, giri\u015f parametrelerini do\u011frulamak veya \u00f6nbellekleme yapmak gibi g\u00f6revler i\u00e7in de decorator&#8217;lar bi\u00e7ilmi\u015f kaftand\u0131r. Bu sayede, uygulaman\u0131z\u0131n ana i\u015f mant\u0131\u011f\u0131n\u0131 ilgilendiren kod par\u00e7ac\u0131klar\u0131n\u0131, \u00e7apraz kesen (cross-cutting) endi\u015felerden ay\u0131rm\u0131\u015f olursunuz. B\u00f6ylece kodunuz daha temiz, daha kolay anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 daha basit hale gelir.<\/p>\n<blockquote><p>\n    Uzman \u0130pucu: Decorator&#8217;lar, fonksiyonlar\u0131n\u0131z\u0131 &#8220;s\u00fcsl\u00fc&#8221; hale getirerek onlara ekstra yetenekler kazand\u0131ran sihirli dokunu\u015flard\u0131r. Bu sayede, ana i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 daha az karma\u015f\u0131k tutarken, yard\u0131mc\u0131 i\u015flevleri d\u0131\u015far\u0131da tutabilirsiniz.\n  <\/p><\/blockquote>\n<p>Python, decorator&#8217;lar\u0131 kullanmay\u0131 son derece kolayla\u015ft\u0131ran \u00f6zel bir s\u00f6z dizimi sunar: <code>@<\/code> sembol\u00fc. Bir fonksiyonun hemen \u00fczerine <code>@decorator_ad\u0131<\/code> yazarak, o decorator&#8217;\u0131 do\u011frudan fonksiyona uygulayabilirsiniz. Bu, asl\u0131nda <code>fonksiyon = decorator_ad\u0131(fonksiyon)<\/code> \u015feklinde bir ataman\u0131n s\u00f6z dizimsel \u015fekeridir. Bu basit ama g\u00fc\u00e7l\u00fc mekanizma sayesinde, fonksiyonlar\u0131n\u0131z\u0131 bir dizi farkl\u0131 ihtiyaca g\u00f6re dinamik olarak g\u00fc\u00e7lendirebilirsiniz. Decorator&#8217;lar, hem k\u00fct\u00fcphanelerde hem de g\u00fcnl\u00fck uygulamalar\u0131n\u0131zda s\u0131k\u00e7a kar\u015f\u0131n\u0131za \u00e7\u0131kacak, Python&#8217;\u0131n en etkili \u00f6zelliklerinden biridir.<\/p>\n<h2>Basit Bir Decorator Nas\u0131l Olu\u015fturulur ve Uygulan\u0131r?<\/h2>\n<p>\u015eimdi gelin, basit bir decorator&#8217;\u0131n ad\u0131m ad\u0131m nas\u0131l olu\u015fturuldu\u011funu ve bir fonksiyona nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ke\u015ffedelim. Amac\u0131m\u0131z, herhangi bir fonksiyonun ne kadar s\u00fcrede \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 \u00f6l\u00e7en bir decorator yazmak olsun. Bu, performans analizi i\u00e7in olduk\u00e7a yayg\u0131n bir ihtiya\u00e7t\u0131r.<\/p>\n<h3>Ad\u0131m 1: Temel Bir Fonksiyon Tan\u0131mlama<\/h3>\n<p>\u0130lk olarak, decorator&#8217;\u0131m\u0131z\u0131 uygulayaca\u011f\u0131m\u0131z basit bir fonksiyona ihtiyac\u0131m\u0131z var:<\/p>\n<pre><code class=\"language-python\">\nimport time\n\ndef uzun_sure_calisan_islem():\n    \"\"\"Sim\u00fcle edilmi\u015f uzun s\u00fcren bir i\u015flem.\"\"\"\n    time.sleep(2) # 2 saniye beklet\n    return \"\u0130\u015flem tamamland\u0131!\"\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu fonksiyon, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, belirli bir s\u00fcre bekleyerek bir i\u015flemi sim\u00fcle ediyor.<\/p>\n<h3>Ad\u0131m 2: Decorator Fonksiyonunu Olu\u015fturma<\/h3>\n<p>Decorator'\u0131m\u0131z, bir ba\u015fka fonksiyonu arg\u00fcman olarak alacak ve bu fonksiyonu sarmalayacak yeni bir fonksiyon d\u00f6nd\u00fcrecek. Bu sarmalay\u0131c\u0131 fonksiyonun i\u00e7inde, orijinal fonksiyonu \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce ve sonra zaman \u00f6l\u00e7\u00fcm\u00fc yapaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-python\">\ndef zaman_olcer(func):\n    def sarmalayici(*args, **kwargs):\n        baslangic_zamani = time.time()\n        sonuc = func(*args, **kwargs) # Orijinal fonksiyonu \u00e7al\u0131\u015ft\u0131r\n        bitis_zamani = time.time()\n        gecen_sure = bitis_zamani - baslangic_zamani\n        print(f\"'{func.__name__}' fonksiyonu {gecen_sure:.4f} saniyede \u00e7al\u0131\u015ft\u0131.\")\n        return sonuc\n    return sarmalayici\n  <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda:<\/p>\n<ul>\n<li><code>zaman_olcer<\/code> d\u0131\u015f fonksiyon (decorator) olarak tan\u0131mlanm\u0131\u015ft\u0131r ve arg\u00fcman olarak <code>func<\/code> (yani dekore edilecek fonksiyonu) al\u0131r.<\/li>\n<li>\u0130\u00e7eride <code>sarmalayici<\/code> ad\u0131nda ba\u015fka bir fonksiyon tan\u0131mlanm\u0131\u015ft\u0131r. Bu, <code>*args<\/code> ve <code>**kwargs<\/code> kullanarak herhangi bir arg\u00fcman alan fonksiyonu sarmalayabilir.<\/li>\n<li><code>sarmalayici<\/code> fonksiyonu i\u00e7inde, orijinal <code>func<\/code> \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce ve sonra zaman damgalar\u0131 al\u0131n\u0131r.<\/li>\n<li><code>func(*args, **kwargs)<\/code> sat\u0131r\u0131, orijinal fonksiyonu \u00e7a\u011f\u0131r\u0131r ve sonucunu kaydeder.<\/li>\n<li>Son olarak, ge\u00e7en s\u00fcre hesaplan\u0131r ve ekrana yazd\u0131r\u0131l\u0131r.<\/li>\n<li><code>zaman_olcer<\/code> fonksiyonu, <code>sarmalayici<\/code> fonksiyonunu d\u00f6nd\u00fcr\u00fcr. Bu, kapatma (closure) ilkesinin bir \u00f6rne\u011fidir, \u00e7\u00fcnk\u00fc <code>sarmalayici<\/code> d\u0131\u015far\u0131dan gelen <code>func<\/code> de\u011fi\u015fkenine eri\u015fmeye devam eder.<\/li>\n<\/ul>\n<h3>Ad\u0131m 3: Decorator'\u0131 Uygulama<\/h3>\n<p>\u015eimdi, decorator'\u0131m\u0131z\u0131 <code>uzun_sure_calisan_islem<\/code> fonksiyonuna uygulayal\u0131m. Bunu yapman\u0131n iki yolu vard\u0131r:<\/p>\n<h4>Y\u00f6ntem 1: <code>@<\/code> S\u00f6z Dizimi ile (Tavsiye Edilen)<\/h4>\n<p>Bu, en yayg\u0131n ve okunabilir y\u00f6ntemdir:<\/p>\n<pre><code class=\"language-python\">\nimport time\n\ndef zaman_olcer(func):\n    def sarmalayici(*args, **kwargs):\n        baslangic_zamani = time.time()\n        sonuc = func(*args, **kwargs)\n        bitis_zamani = time.time()\n        gecen_sure = bitis_zamani - baslangic_zamani\n        print(f\"'{func.__name__}' fonksiyonu {gecen_sure:.4f} saniyede \u00e7al\u0131\u015ft\u0131.\")\n        return sonuc\n    return sarmalayici\n\n@zaman_olcer\ndef uzun_sure_calisan_islem():\n    \"\"\"Sim\u00fcle edilmi\u015f uzun s\u00fcren bir i\u015flem.\"\"\"\n    time.sleep(2)\n    return \"\u0130\u015flem tamamland\u0131!\"\n\n# Fonksiyonu \u00e7a\u011f\u0131ral\u0131m\nprint(uzun_sure_calisan_islem())\n  <\/pre>\n<p><\/code><\/p>\n<p>\u00c7\u0131kt\u0131 \u015f\u00f6yle olacakt\u0131r:<\/p>\n<pre><code class=\"language-plaintext\">\n'uzun_sure_calisan_islem' fonksiyonu 2.00XX saniyede \u00e7al\u0131\u015ft\u0131.\n\u0130\u015flem tamamland\u0131!\n  <\/pre>\n<p><\/code><\/p>\n<p><code>@zaman_olcer<\/code> sat\u0131r\u0131, Python'a <code>uzun_sure_calisan_islem<\/code> fonksiyonunun asl\u0131nda <code>zaman_olcer(uzun_sure_calisan_islem)<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131n d\u00f6nd\u00fcrd\u00fc\u011f\u00fc fonksiyon ile de\u011fi\u015ftirilmesi gerekti\u011fini s\u00f6yler.<\/p>\n<h4>Y\u00f6ntem 2: Manuel Uygulama<\/h4>\n<p><code>@<\/code> sembol\u00fcn\u00fcn asl\u0131nda ne yapt\u0131\u011f\u0131n\u0131 daha iyi anlamak i\u00e7in, ayn\u0131 i\u015flemi manuel olarak da yapabiliriz:<\/p>\n<pre><code class=\"language-python\">\n# Decorator ve orijinal fonksiyon tan\u0131mland\u0131ktan sonra:\ndef uzun_sure_calisan_islem_orjinal():\n    \"\"\"Sim\u00fcle edilmi\u015f uzun s\u00fcren bir i\u015flem.\"\"\"\n    time.sleep(2)\n    return \"\u0130\u015flem tamamland\u0131!\"\n\nuzun_sure_calisan_islem_dekore_edilmis = zaman_olcer(uzun_sure_calisan_islem_orjinal)\nprint(uzun_sure_calisan_islem_dekore_edilmis())\n  <\/pre>\n<p><\/code><\/p>\n<p>Her iki y\u00f6ntem de ayn\u0131 sonucu verir, ancak <code>@<\/code> s\u00f6z dizimi, kodun daha temiz ve okunakl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu basit \u00f6rnek, bir decorator'\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131n ve fonksiyonlara nas\u0131l ekstra i\u015flevsellik katt\u0131\u011f\u0131n\u0131n temelini olu\u015fturur. \u015eimdi, bu bilgiyi daha karma\u015f\u0131k senaryolara nas\u0131l uygulayabilece\u011fimizi inceleyelim.<\/p>\n<h2>Parametre Alan Decoratorlar ve Zincirleme Decorator Kullan\u0131m\u0131 Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Bazen decorator'lar\u0131n\u0131z\u0131n belirli ayarlar veya konfig\u00fcrasyonlarla \u00e7al\u0131\u015fmas\u0131n\u0131 isteyebilirsiniz. \u00d6rne\u011fin, bir loglama decorator'\u0131 yazarken, log seviyesini veya log dosyas\u0131n\u0131n ad\u0131n\u0131 decorator'a arg\u00fcman olarak ge\u00e7irmek isteyebilirsiniz. \u0130\u015fte bu noktada parametre alan decorator'lar devreye girer. Ayr\u0131ca, bir fonksiyona birden fazla decorator uygulaman\u0131z gereken durumlar da olacakt\u0131r; bu da zincirleme decorator kullan\u0131m\u0131n\u0131 gerektirir.<\/p>\n<h3>Parametre Alan Decorator'lar Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Bir decorator'a parametre ge\u00e7irmek i\u00e7in, decorator yap\u0131s\u0131na bir katman daha eklememiz gerekir. D\u0131\u015f fonksiyon, \u015fimdi parametreleri alacak ve <em>bir decorator fonksiyonu d\u00f6nd\u00fcrecek<\/em> bir fabrika fonksiyonu haline gelir. Bu decorator fonksiyonu da daha \u00f6nce g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi hedef fonksiyonu al\u0131p sarmalay\u0131c\u0131y\u0131 d\u00f6nd\u00fcrecektir.<\/p>\n<p>\u00d6rnek olarak, bir yetkilendirme decorator'\u0131 yazal\u0131m. Bu decorator, sadece belirli rollere sahip kullan\u0131c\u0131lar\u0131n bir fonksiyona eri\u015fmesine izin verecek:<\/p>\n<pre><code class=\"language-python\">\ndef yetki_gerektiren(gerekli_roller):\n    def decorator(func):\n        def sarmalayici(kullanici_rolu, *args, **kwargs):\n            if kullanici_rolu in gerekli_roller:\n                print(f\"Eri\u015fim izni verildi. '{func.__name__}' \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor.\")\n                return func(kullanici_rolu, *args, **kwargs)\n            else:\n                print(f\"Eri\u015fim reddedildi. '{func.__name__}' fonksiyonuna '{kullanici_rolu}' rol\u00fcyle eri\u015filemez.\")\n                return None\n        return sarmalayici\n    return decorator\n\n@yetki_gerektiren(gerekli_roller=[\"admin\", \"editor\"])\ndef makale_yayinla(kullanici_rolu, makale_basligi):\n    return f\"'{makale_basligi}' makalesi '{kullanici_rolu}' taraf\u0131ndan yay\u0131nland\u0131.\"\n\n@yetki_gerektiren(gerekli_roller=[\"admin\"])\ndef kullanici_sil(kullanici_rolu, hedef_kullanici_id):\n    return f\"'{hedef_kullanici_id}' ID'li kullan\u0131c\u0131 '{kullanici_rolu}' taraf\u0131ndan silindi.\"\n\n# Test edelim\nprint(makale_yayinla(\"admin\", \"Python Decoratorlar\u0131 Rehberi\"))\nprint(makale_yayinla(\"yazar\", \"Python Decoratorlar\u0131 Rehberi\"))\nprint(kullanici_sil(\"admin\", 123))\nprint(kullanici_sil(\"editor\", 456))\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte:<\/p>\n<ul>\n<li><code>yetki_gerektiren<\/code>, parametre olarak <code>gerekli_roller<\/code> listesini al\u0131r. Bu, d\u0131\u015ftaki fabrika fonksiyonudur.<\/li>\n<li>Bu fabrika fonksiyonu, ger\u00e7ek decorator olan <code>decorator<\/code> fonksiyonunu d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>decorator<\/code> fonksiyonu, dekore edilecek <code>func<\/code> fonksiyonunu al\u0131r ve <code>sarmalayici<\/code>y\u0131 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>sarmalayici<\/code>, kullan\u0131c\u0131 rol\u00fcn\u00fc kontrol eder ve eri\u015fim izni varsa orijinal fonksiyonu \u00e7a\u011f\u0131r\u0131r.<\/li>\n<\/ul>\n<p>\u00c7\u0131kt\u0131 \u015f\u00f6yle olacakt\u0131r:<\/p>\n<pre><code class=\"language-plaintext\">\nEri\u015fim izni verildi. 'makale_yayinla' \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor.\n'Python Decoratorlar\u0131 Rehberi' makalesi 'admin' taraf\u0131ndan yay\u0131nland\u0131.\nEri\u015fim reddedildi. 'makale_yayinla' fonksiyonuna 'yazar' rol\u00fcyle eri\u015filemez.\nNone\nEri\u015fim izni verildi. 'kullanici_sil' \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor.\n'123' ID'li kullan\u0131c\u0131 'admin' taraf\u0131ndan silindi.\nEri\u015fim reddedildi. 'kullanici_sil' fonksiyonuna 'editor' rol\u00fcyle eri\u015filemez.\nNone\n  <\/pre>\n<p><\/code><\/p>\n<h3>Zincirleme Decorator Kullan\u0131m\u0131<\/h3>\n<p>Bir fonksiyona birden fazla decorator uygulayabilirsiniz. Bu durumda, decorator'lar yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru s\u0131rayla uygulan\u0131r, yani en \u00fcstteki decorator en d\u0131\u015ftaki sarmalay\u0131c\u0131 olur.<\/p>\n<p>Bir \u00f6nceki <code>zaman_olcer<\/code> decorator'\u0131m\u0131z\u0131 ve yeni <code>yetki_gerektiren<\/code> decorator'\u0131m\u0131z\u0131 kullanarak bir \u00f6rnek olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-python\">\nimport time\nfrom functools import wraps # func.__name__ gibi metadata'y\u0131 korumak i\u00e7in\n\ndef zaman_olcer(func):\n    @wraps(func) # Bu \u00f6nemli! A\u015fa\u011f\u0131da a\u00e7\u0131klanacak.\n    def sarmalayici(*args, **kwargs):\n        baslangic_zamani = time.time()\n        sonuc = func(*args, **kwargs)\n        bitis_zamani = time.time()\n        gecen_sure = bitis_zamani - baslangic_zamani\n        print(f\"'{func.__name__}' fonksiyonu {gecen_sure:.4f} saniyede \u00e7al\u0131\u015ft\u0131.\")\n        return sonuc\n    return sarmalayici\n\ndef yetki_gerektiren(gerekli_roller):\n    def decorator(func):\n        @wraps(func)\n        def sarmalayici(kullanici_rolu, *args, **kwargs):\n            if kullanici_rolu in gerekli_roller:\n                print(f\"Eri\u015fim izni verildi. '{func.__name__}' \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor.\")\n                return func(kullanici_rolu, *args, **kwargs)\n            else:\n                print(f\"Eri\u015fim reddedildi. '{func.__name__}' fonksiyonuna '{kullanici_rolu}' rol\u00fcyle eri\u015filemez.\")\n                return None\n        return sarmalayici\n    return decorator\n\n@zaman_olcer\n@yetki_gerektiren(gerekli_roller=[\"admin\"])\ndef kritik_islem(kullanici_rolu, veri):\n    time.sleep(1)\n    return f\"'{veri}' '{kullanici_rolu}' taraf\u0131ndan ba\u015far\u0131yla i\u015flendi.\"\n\nprint(kritik_islem(\"admin\", \"hassas veri\"))\nprint(kritik_islem(\"yazar\", \"hassas veri\"))\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte <code>@zaman_olcer<\/code> en d\u0131\u015fta, <code>@yetki_gerektiren<\/code> ise i\u00e7tedir. Bu, \u00f6nce yetki kontrol\u00fcn\u00fcn yap\u0131laca\u011f\u0131, ard\u0131ndan fonksiyonun \u00e7al\u0131\u015fma s\u00fcresinin \u00f6l\u00e7\u00fclece\u011fi anlam\u0131na gelir. Yani, bir fonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, en \u00fcstteki decorator taraf\u0131ndan sarmalanan fonksiyon \u00e7a\u011fr\u0131l\u0131r, o da bir alt\u0131ndaki decorator'\u0131n sarmalad\u0131\u011f\u0131 fonksiyonu \u00e7a\u011f\u0131r\u0131r ve bu b\u00f6yle devam eder.<\/p>\n<p><code>functools.wraps<\/code> kullan\u0131m\u0131, burada kritik bir rol oynar. Decorator'lar, fonksiyonun ismini (<code>__name__<\/code>), docstring'ini (<code>__doc__<\/code>) ve di\u011fer metadatay\u0131 sarmalay\u0131c\u0131 fonksiyonun metadatas\u0131yla de\u011fi\u015ftirme e\u011filimindedir. <code>@wraps(func)<\/code> decorator'\u0131, sarmalay\u0131c\u0131 fonksiyonun metadatas\u0131n\u0131 orijinal fonksiyonun metadatas\u0131yla g\u00fcncelleyerek bu sorunu \u00e7\u00f6zer. Bu, hata ay\u0131klama ve belgeleme a\u00e7\u0131s\u0131ndan son derece \u00f6nemlidir.<\/p>\n<pre><code class=\"language-plaintext\">\nEri\u015fim izni verildi. 'kritik_islem' \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor.\n'kritik_islem' fonksiyonu 1.00XX saniyede \u00e7al\u0131\u015ft\u0131.\n'hassas veri' 'admin' taraf\u0131ndan ba\u015far\u0131yla i\u015flendi.\nEri\u015fim reddedildi. 'kritik_islem' fonksiyonuna 'yazar' rol\u00fcyle eri\u015filemez.\nNone\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu b\u00f6l\u00fcm, decorator'lar\u0131n\u0131z\u0131 daha dinamik ve esnek hale getirmenin yollar\u0131n\u0131 g\u00f6sterdi. Parametre alan decorator'lar ile daha genel \u00e7\u00f6z\u00fcmler \u00fcretebilir, zincirleme decorator'lar ile de fonksiyonlar\u0131n\u0131za birden fazla i\u015flevsellik katman\u0131n\u0131 d\u00fczenli bir \u015fekilde ekleyebilirsiniz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda Decorator Kullan\u0131m\u0131: Vaka Analizleri<\/h2>\n<p>Decorator'lar\u0131n teorik temellerini ve nas\u0131l olu\u015fturuldu\u011funu anlad\u0131k. \u015eimdi, bu g\u00fc\u00e7l\u00fc arac\u0131n ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, \u00f6zellikle de b\u00fcy\u00fck \u00f6l\u00e7ekli projelerde veya yayg\u0131n yaz\u0131l\u0131m geli\u015ftirme g\u00f6revlerinde nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 inceleyelim. \u00dc\u00e7 yayg\u0131n senaryo \u00fczerinden vaka analizleri yaparak, decorator'lar\u0131n pratik de\u011ferini ortaya koyaca\u011f\u0131z.<\/p>\n<h3>Vaka 1: Loglama ve Hata Y\u00f6netimi<\/h3>\n<p>Herhangi bir uygulaman\u0131n \u00f6nemli bir par\u00e7as\u0131, i\u015flemlerin kayd\u0131n\u0131 tutmak ve olas\u0131 hatalar\u0131 yakalamakt\u0131r. Bir web servisindeki her API \u00e7a\u011fr\u0131s\u0131n\u0131n veya bir arka plan g\u00f6revindeki her kritik ad\u0131m\u0131n loglanmas\u0131 gerekebilir. Her fonksiyonun i\u00e7ine manuel olarak loglama kodu eklemek, kod tekrar\u0131na yol a\u00e7ar ve bak\u0131m\u0131 zorla\u015ft\u0131r\u0131r. \u0130\u015fte burada loglama decorator'lar\u0131 devreye girer.<\/p>\n<p>Bir \u00f6rnekle a\u00e7\u0131klayal\u0131m: Bir finansal i\u015flem sisteminde her para transferi i\u015fleminin ba\u015flamas\u0131 ve biti\u015fini kaydetmek istiyoruz. Ayr\u0131ca bir hata olu\u015ftu\u011funda bu hatay\u0131 da loglamal\u0131y\u0131z.<\/p>\n<pre><code class=\"language-python\">\nimport logging\nfrom functools import wraps\n\n# Loglama yap\u0131land\u0131rmas\u0131\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\n\ndef islem_loglayici(func):\n    @wraps(func)\n    def sarmalayici(*args, **kwargs):\n        logging.info(f\"Fonksiyon '{func.__name__}' \u00e7a\u011fr\u0131l\u0131yor. Arg\u00fcmanlar: {args}, kwargs: {kwargs}\")\n        try:\n            sonuc = func(*args, **kwargs)\n            logging.info(f\"Fonksiyon '{func.__name__}' ba\u015far\u0131yla tamamland\u0131. Sonu\u00e7: {sonuc}\")\n            return sonuc\n        except Exception as e:\n            logging.error(f\"Fonksiyon '{func.__name__}' \u00e7al\u0131\u015f\u0131rken bir hata olu\u015ftu: {e}\", exc_info=True)\n            raise # Hatan\u0131n tekrar f\u0131rlat\u0131lmas\u0131, \u00e7a\u011fr\u0131c\u0131n\u0131n da haberdar olmas\u0131n\u0131 sa\u011flar.\n    return sarmalayici\n\n@islem_loglayici\ndef para_transferi(gonderen_hesap, alici_hesap, miktar):\n    if miktar <= 0:\n        raise ValueError(\"Transfer miktar\u0131 s\u0131f\u0131rdan b\u00fcy\u00fck olmal\u0131d\u0131r.\")\n    # Ger\u00e7ek transfer mant\u0131\u011f\u0131 burada olurdu\n    print(f\"{gonderen_hesap} hesab\u0131ndan {alici_hesap} hesab\u0131na {miktar} TL transfer edildi.\")\n    return True\n\nprint(\"--- Ba\u015far\u0131l\u0131 Transfer ---\")\npara_transferi(\"TR123\", \"TR456\", 1000)\n\nprint(\"\\n--- Ba\u015far\u0131s\u0131z Transfer (Hata) ---\")\ntry:\n    para_transferi(\"TR789\", \"TR012\", -500)\nexcept ValueError as e:\n    print(f\"Hata yakaland\u0131: {e}\")\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu decorator sayesinde, <code>para_transferi<\/code> fonksiyonuna loglama ve hata y\u00f6netimi i\u015flevselli\u011fini temiz bir \u015fekilde eklemi\u015f olduk. Fonksiyonun as\u0131l g\u00f6revi sadece para transferini ger\u00e7ekle\u015ftirmekken, loglama decorator'\u0131 onun yan g\u00f6revlerini \u00fcstlenir. Bu, kodun ana mant\u0131\u011f\u0131n\u0131 sade tutar.<\/p>\n<h3>Vaka 2: \u00d6nbellekleme (Caching)<\/h3>\n<p>Veritaban\u0131 sorgular\u0131, API \u00e7a\u011fr\u0131lar\u0131 veya hesaplama yo\u011fun i\u015flemler gibi kaynak t\u00fcketen g\u00f6revlerin sonu\u00e7lar\u0131 s\u0131k s\u0131k ayn\u0131 arg\u00fcmanlarla isteniyorsa, bu sonu\u00e7lar\u0131 \u00f6nbelle\u011fe almak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Python'\u0131n <code>functools<\/code> mod\u00fcl\u00fc, bu t\u00fcr bir \u00f6nbellekleme i\u00e7in harika bir yerle\u015fik decorator olan <code>@lru_cache<\/code>'i sunar. LRU (Least Recently Used) stratejisi, en az kullan\u0131lan \u00f6\u011feleri \u00f6nbellekten atarak belle\u011fi verimli kullan\u0131r.<\/p>\n<pre><code class=\"language-python\">\nfrom functools import lru_cache\nimport time\n\n# Varsayal\u0131m ki bu bir veritaban\u0131 sorgusudur veya hesaplama yo\u011fun bir i\u015flemdir\n@lru_cache(maxsize=None) # maxsize=None, \u00f6nbelle\u011fin s\u0131n\u0131rs\u0131z olmas\u0131n\u0131 sa\u011flar\ndef pahali_hesaplama(sayi):\n    print(f\"Pahal\u0131 hesaplama yap\u0131l\u0131yor: {sayi}...\")\n    time.sleep(1) # \u0130\u015flemin uzun s\u00fcrd\u00fc\u011f\u00fcn\u00fc sim\u00fcle edelim\n    return sayi * sayi\n\nprint(\"--- \u0130lk \u00c7a\u011fr\u0131lar ---\")\nprint(pahali_hesaplama(5))\nprint(pahali_hesaplama(3))\n\nprint(\"\\n--- \u00d6nbellekten Gelen \u00c7a\u011fr\u0131lar ---\")\nprint(pahali_hesaplama(5)) # Bu \u00e7a\u011fr\u0131 h\u0131zl\u0131 olacak\nprint(pahali_hesaplama(3)) # Bu \u00e7a\u011fr\u0131 da h\u0131zl\u0131 olacak\n\nprint(\"\\n--- Yeni \u00c7a\u011fr\u0131 ---\")\nprint(pahali_hesaplama(7)) # Bu \u00e7a\u011fr\u0131 yava\u015f olacak, \u00f6nbelle\u011fe eklenecek\n  <\/pre>\n<p><\/code><\/p>\n<p>\u00c7\u0131kt\u0131ya bakt\u0131\u011f\u0131n\u0131zda, \"Pahal\u0131 hesaplama yap\u0131l\u0131yor\" mesaj\u0131n\u0131n sadece ilk kez o arg\u00fcmanlarla fonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc fark edeceksiniz. \u0130kinci \u00e7a\u011fr\u0131larda sonu\u00e7 do\u011frudan \u00f6nbellekten al\u0131n\u0131r ve bu da performansta \u00f6nemli bir art\u0131\u015f sa\u011flar. <code>@lru_cache<\/code> decorator'\u0131, fonksiyonunuzun i\u00e7ine tek bir sat\u0131r kod bile yazmadan \u00f6nbellekleme yetene\u011fi kazand\u0131r\u0131r.<\/p>\n<h3>Vaka 3: Yetkilendirme ve Kimlik Do\u011frulama<\/h3>\n<p>Web uygulamalar\u0131nda belirli rotalar\u0131n (URL'lerin) veya API u\u00e7 noktalar\u0131n\u0131n sadece kimli\u011fi do\u011frulanm\u0131\u015f veya belirli rollere sahip kullan\u0131c\u0131lar taraf\u0131ndan eri\u015filebilir olmas\u0131 yayg\u0131n bir gerekliliktir. Flask veya Django gibi web framework'lerinde bu t\u00fcr decorator'lar\u0131 s\u0131k\u00e7a g\u00f6r\u00fcrs\u00fcn\u00fcz.<\/p>\n<p>\u00d6nceki b\u00f6l\u00fcmde basit bir yetkilendirme decorator'\u0131 olu\u015fturmu\u015ftuk. \u015eimdi bunu biraz daha geli\u015ftirerek ger\u00e7ek bir senaryoya uyarlayal\u0131m:<\/p>\n<pre><code class=\"language-python\">\nfrom functools import wraps\n\n# Varsay\u0131msal bir mevcut kullan\u0131c\u0131 ve rol bilgisi\nKULLANICILAR = {\n    \"ali\": {\"rol\": \"admin\"},\n    \"ayse\": {\"rol\": \"editor\"},\n    \"can\": {\"rol\": \"viewer\"},\n}\n\ndef login_required(func):\n    @wraps(func)\n    def sarmalayici(username, *args, **kwargs):\n        if username in KULLANICILAR:\n            return func(username, *args, **kwargs)\n        else:\n            print(f\"Hata: '{username}' kullan\u0131c\u0131s\u0131 i\u00e7in kimlik do\u011frulama ba\u015far\u0131s\u0131z.\")\n            return None\n    return sarmalayici\n\ndef role_required(required_role):\n    def decorator(func):\n        @wraps(func)\n        def sarmalayici(username, *args, **kwargs):\n            if username not in KULLANICILAR:\n                print(f\"Hata: '{username}' kullan\u0131c\u0131s\u0131 bulunamad\u0131.\")\n                return None\n            user_role = KULLANICILAR[username][\"rol\"]\n            if user_role == required_role:\n                return func(username, *args, **kwargs)\n            else:\n                print(f\"Hata: '{username}' kullan\u0131c\u0131s\u0131n\u0131n '{user_role}' rol\u00fc, '{required_role}' gereksinimini kar\u015f\u0131lam\u0131yor.\")\n                return None\n        return sarmalayici\n    return decorator\n\n@login_required\n@role_required(\"admin\")\ndef yonetici_paneli_goster(username):\n    return f\"Ho\u015f geldin, {username}! Y\u00f6netici paneline eri\u015ftin.\"\n\n@login_required\n@role_required(\"editor\")\ndef makale_duzenle(username, makale_id):\n    return f\"Ho\u015f geldin, {username}! {makale_id} numaral\u0131 makaleyi d\u00fczenliyorsun.\"\n\nprint(\"--- Y\u00f6netici Paneli Denemeleri ---\")\nprint(yonetici_paneli_goster(\"ali\"))\nprint(yonetici_paneli_goster(\"ayse\"))\nprint(yonetici_paneli_goster(\"mehmet\")) # Mevcut olmayan kullan\u0131c\u0131\n\nprint(\"\\n--- Makale D\u00fczenleme Denemeleri ---\")\nprint(makale_duzenle(\"ayse\", 101))\nprint(makale_duzenle(\"ali\", 102))\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, \u00f6nce <code>login_required<\/code> decorator'\u0131 kullan\u0131c\u0131n\u0131n varl\u0131\u011f\u0131n\u0131 kontrol eder, ard\u0131ndan <code>role_required<\/code> decorator'\u0131 kullan\u0131c\u0131n\u0131n rol\u00fcn\u00fcn belirli bir i\u015flev i\u00e7in gerekli olan rol\u00fc kar\u015f\u0131lay\u0131p kar\u015f\u0131lamad\u0131\u011f\u0131n\u0131 denetler. Bu iki decorator'\u0131n zincirleme kullan\u0131m\u0131, g\u00fcvenlik mant\u0131\u011f\u0131n\u0131 uygulama kodundan ayr\u0131, mod\u00fcler ve yeniden kullan\u0131labilir bir yap\u0131da tutar.<\/p>\n<p>Bu vaka analizleri, decorator'lar\u0131n sadece kod tekrar\u0131n\u0131 azaltmakla kalmay\u0131p, ayn\u0131 zamanda karma\u015f\u0131k sistemlerde g\u00fcvenlik, performans ve g\u00f6zlemlenebilirlik gibi \u00e7apraz kesen endi\u015feleri y\u00f6netmek i\u00e7in ne kadar g\u00fc\u00e7l\u00fc ve esnek bir ara\u00e7 oldu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bu sayede geli\u015ftiriciler, i\u015f mant\u0131\u011f\u0131na odaklanabilirken, yard\u0131mc\u0131 i\u015flevler decorator'lar arac\u0131l\u0131\u011f\u0131yla sorunsuz bir \u015fekilde entegre edilebilir.<\/p>\n<h2>Decorator Kullan\u0131m\u0131nda Kar\u015f\u0131la\u015f\u0131labilecek Zorluklar ve \u00c7\u00f6z\u00fcmleri Nelerdir?<\/h2>\n<p>Python decorator'lar\u0131 son derece g\u00fc\u00e7l\u00fc ve kullan\u0131\u015fl\u0131d\u0131r, ancak yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda veya belirli durumlar g\u00f6z ard\u0131 edildi\u011finde baz\u0131 zorluklara yol a\u00e7abilirler. Bu b\u00f6l\u00fcmde, decorator'larla \u00e7al\u0131\u015f\u0131rken s\u0131k kar\u015f\u0131la\u015f\u0131lan sorunlar\u0131 ve bunlara y\u00f6nelik \u00e7\u00f6z\u00fcmleri ele alaca\u011f\u0131z.<\/p>\n<h3>1. Fonksiyon Metadatas\u0131n\u0131n Kayb\u0131 (<code>__name__<\/code>, <code>__doc__<\/code>)<\/h3>\n<p>Bir fonksiyon bir decorator taraf\u0131ndan sarmaland\u0131\u011f\u0131nda, orijinal fonksiyonun ad\u0131, dok\u00fcmantasyon dizgisi (docstring) ve di\u011fer metadatas\u0131 genellikle sarmalay\u0131c\u0131 fonksiyonun metadatas\u0131yla de\u011fi\u015ftirilir. Bu durum, hata ay\u0131klama, dok\u00fcmantasyon olu\u015fturma veya di\u011fer ara\u00e7lar\u0131n orijinal fonksiyonun bilgilerine eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda sorunlara yol a\u00e7abilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm: <code>functools.wraps<\/code> Kullan\u0131m\u0131<\/strong><\/p>\n<p>Python'\u0131n <code>functools<\/code> mod\u00fcl\u00fcndeki <code>@wraps<\/code> decorator'\u0131, bu sorunu \u00e7\u00f6zmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Kendi decorator'\u0131n\u0131z\u0131n i\u00e7 sarmalay\u0131c\u0131 fonksiyonuna <code>@wraps(func)<\/code> uygulayarak, sarmalay\u0131c\u0131 fonksiyonun metadatas\u0131n\u0131 orijinal fonksiyonun metadatas\u0131yla otomatik olarak g\u00fcncelleyebilirsiniz. Bu, hata ay\u0131klay\u0131c\u0131lar\u0131n, test ara\u00e7lar\u0131n\u0131n ve di\u011fer yard\u0131mc\u0131 programlar\u0131n do\u011fru bilgilere eri\u015fmesini sa\u011flar.<\/p>\n<pre><code class=\"language-python\">\nfrom functools import wraps\n\ndef bir_decorator(func):\n    @wraps(func) # Buras\u0131 \u00f6nemli!\n    def sarmalayici(*args, **kwargs):\n        \"\"\"Bu sarmalay\u0131c\u0131 fonksiyonun docstring'i.\"\"\"\n        print(f\"'{func.__name__}' \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce...\")\n        sonuc = func(*args, **kwargs)\n        print(f\"'{func.__name__}' \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131ktan sonra.\")\n        return sonuc\n    return sarmalayici\n\n@bir_decorator\ndef hedef_fonksiyon():\n    \"\"\"Hedef fonksiyonun docstring'i.\"\"\"\n    return \"Merhaba, d\u00fcnya!\"\n\nprint(f\"Fonksiyon ad\u0131: {hedef_fonksiyon.__name__}\")\nprint(f\"Docstring: {hedef_fonksiyon.__doc__}\")\nhedef_fonksiyon()\n  <\/pre>\n<p><\/code><\/p>\n<p><code>@wraps(func)<\/code> olmadan, <code>__name__<\/code> \"sarmalayici\" ve <code>__doc__<\/code> \"Bu sarmalay\u0131c\u0131 fonksiyonun docstring'i.\" olurdu. <code>@wraps<\/code> sayesinde \u00e7\u0131kt\u0131 \u015f\u00f6yle olacakt\u0131r:<\/p>\n<pre><code class=\"language-plaintext\">\nFonksiyon ad\u0131: hedef_fonksiyon\nDocstring: Hedef fonksiyonun docstring'i.\n'hedef_fonksiyon' \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce...\n'hedef_fonksiyon' \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131ktan sonra.\n  <\/pre>\n<p><\/code><\/p>\n<h3>2. Decorator Zincirlerinde Anlama G\u00fc\u00e7l\u00fc\u011f\u00fc<\/h3>\n<p>Birden fazla decorator zincirlendi\u011finde, uygulama s\u0131ras\u0131 bazen kafa kar\u0131\u015ft\u0131r\u0131c\u0131 olabilir. Hat\u0131rlatmak gerekirse, decorator'lar yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru uygulan\u0131r; yani en \u00fcstteki decorator en d\u0131\u015ftaki sarmalay\u0131c\u0131d\u0131r ve \u00e7a\u011fr\u0131 en i\u00e7teki orijinal fonksiyona ula\u015fana kadar katman katman ge\u00e7er.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm: G\u00f6rselle\u015ftirme ve Basit Tutma<\/strong><\/p>\n<p>Decorator zincirlerini anlamak i\u00e7in, her decorator'\u0131 bir \"so\u011fan katman\u0131\" olarak d\u00fc\u015f\u00fcnmek yard\u0131mc\u0131 olabilir. \u00c7a\u011fr\u0131 en d\u0131\u015ftaki katmandan ba\u015flar ve i\u00e7eri do\u011fru ilerler. Karma\u015f\u0131k zincirlerden ka\u00e7\u0131nmak ve her decorator'\u0131n tek bir sorumlulu\u011fu olmas\u0131n\u0131 sa\u011flamak, okunabilirli\u011fi art\u0131r\u0131r.<\/p>\n<pre><code class=\"language-python\">\n# @decorator_a\n# @decorator_b\n# def hedef_fonksiyon(): ...\n\n# Yukar\u0131daki, a\u015fa\u011f\u0131daki gibidir:\n# hedef_fonksiyon = decorator_a(decorator_b(hedef_fonksiyon))\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu, <code>decorator_a<\/code>'n\u0131n <code>decorator_b<\/code>'nin d\u00f6nd\u00fcrd\u00fc\u011f\u00fc sarmalay\u0131c\u0131y\u0131 sarmalad\u0131\u011f\u0131 anlam\u0131na gelir.<\/p>\n<h3>3. Decorator'lar\u0131n Performans Etkisi<\/h3>\n<p>Her decorator, bir fonksiyon \u00e7a\u011fr\u0131s\u0131n\u0131n \u00fczerine ek bir katman ekledi\u011fi i\u00e7in, bu durum hafif bir performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olabilir. K\u00fc\u00e7\u00fck, s\u0131k \u00e7a\u011fr\u0131lan fonksiyonlara a\u015f\u0131r\u0131 miktarda decorator eklemek, \u00f6zellikle d\u00f6ng\u00fcler i\u00e7inde performans sorunlar\u0131 yaratabilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm: \u00d6l\u00e7\u00fcmleme ve \u0130htiyaca G\u00f6re Kullan\u0131m<\/strong><\/p>\n<p>Performans\u0131n kritik oldu\u011fu yerlerde, decorator'lar\u0131n\u0131z\u0131 dikkatli se\u00e7meli ve ger\u00e7ekten gerekli olduklar\u0131ndan emin olmal\u0131s\u0131n\u0131z. Python'\u0131n <code>timeit<\/code> mod\u00fcl\u00fc gibi ara\u00e7larla fonksiyonlar\u0131n\u0131z\u0131n performans\u0131n\u0131 \u00f6l\u00e7erek, decorator'lar\u0131n etkisini g\u00f6zlemleyebilirsiniz. \u00c7o\u011fu durumda, decorator'lar\u0131n getirdi\u011fi performans y\u00fck\u00fc \u00f6nemsizdir ve sa\u011flad\u0131\u011f\u0131 kod temizli\u011fi avantaj\u0131 bu k\u00fc\u00e7\u00fck maliyeti telafi eder.<\/p>\n<h3>4. S\u0131n\u0131f Decoratorlar\u0131 ve <code>__call__<\/code> Metodu<\/h3>\n<p>Fonksiyonlar\u0131n yan\u0131 s\u0131ra, s\u0131n\u0131flar\u0131 da decorator olarak kullanabiliriz. Bir s\u0131n\u0131f\u0131n decorator olarak kullan\u0131labilmesi i\u00e7in, bir \u00f6rnek (instance) olarak \u00e7a\u011fr\u0131labilir olmas\u0131, yani <code>__call__<\/code> metodunu uygulamas\u0131 gerekir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm: <code>__call__<\/code> Metodunu Uygulayan S\u0131n\u0131flar<\/strong><\/p>\n<pre><code class=\"language-python\">\nclass Logger:\n    def __init__(self, func):\n        self.func = func\n        wraps(func)(self) # Metadatay\u0131 kopyala\n\n    def __call__(self, *args, **kwargs):\n        print(f\"LOG: '{self.func.__name__}' \u00e7a\u011fr\u0131l\u0131yor.\")\n        sonuc = self.func(*args, **kwargs)\n        print(f\"LOG: '{self.func.__name__}' tamamland\u0131. Sonu\u00e7: {sonuc}\")\n        return sonuc\n\n@Logger\ndef toplama(a, b):\n    return a + b\n\nprint(toplama(5, 3))\nprint(toplama(10, 20))\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>Logger<\/code> s\u0131n\u0131f\u0131 bir decorator olarak i\u015flev g\u00f6r\u00fcr. <code>__init__<\/code> metodu dekore edilecek fonksiyonu al\u0131r, <code>__call__<\/code> metodu ise sarmalay\u0131c\u0131 fonksiyonun i\u015flevini g\u00f6r\u00fcr. S\u0131n\u0131f tabanl\u0131 decorator'lar, durum (state) tutmalar\u0131 gerekti\u011finde veya daha karma\u015f\u0131k yap\u0131land\u0131rmalara ihtiya\u00e7 duyuldu\u011funda kullan\u0131\u015fl\u0131 olabilir.<\/p>\n<p>Decorator'lar, Python'da kodun yeniden kullan\u0131labilirli\u011fini ve okunabilirli\u011fini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131ran harika bir ara\u00e7t\u0131r. Ancak, yukar\u0131da belirtilen zorluklar\u0131 ve \u00e7\u00f6z\u00fcmlerini bilmek, bu arac\u0131 daha etkili ve sorunsuz bir \u015fekilde kullanman\u0131z\u0131 sa\u011flar. Unutmay\u0131n, iyi bir yaz\u0131l\u0131m m\u00fchendisli\u011fi prati\u011fi, g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131 ne zaman ve nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 bilmekten ge\u00e7er.<\/p>\n<blockquote><p>\n    Uzman \u0130pucu: Decorator'lar\u0131, \u00e7apraz kesen (cross-cutting) endi\u015feleri (logging, caching, authorization) ana i\u015f mant\u0131\u011f\u0131n\u0131zdan ay\u0131rmak i\u00e7in bir \"mikro-hizmet\" gibi d\u00fc\u015f\u00fcn\u00fcn. Her decorator, tek bir i\u015flevselli\u011fe odaklanarak kodunuzu daha mod\u00fcler hale getirir.\n  <\/p><\/blockquote>\n<h2>Sonu\u00e7: Python Decoratorlar\u0131 ile Kodunuzu Daha Okunabilir ve Bak\u0131m\u0131 Kolay Hale Getirin<\/h2>\n<p>Bu makale boyunca, Python decorator'lar\u0131n\u0131n ne oldu\u011funu, neden bu kadar \u00f6nemli olduklar\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullan\u0131labileceklerini detayl\u0131 bir \u015fekilde inceledik. Decorator'lar\u0131n, fonksiyonlar\u0131 arg\u00fcman olarak al\u0131p yeni fonksiyonlar d\u00f6nd\u00fcren, Python'\u0131n metaprogramlama yeteneklerini kullanan g\u00fc\u00e7l\u00fc yap\u0131lar oldu\u011funu \u00f6\u011frendik. <code>@<\/code> s\u00f6z dizimi sayesinde, mevcut fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftirmek veya geni\u015fletmek i\u00e7in \u015f\u0131k ve Python'a \u00f6zg\u00fc bir yol sunduklar\u0131n\u0131 g\u00f6rd\u00fck.<\/p>\n<p>Decorator'lar sayesinde, kod tekrar\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azaltabilir, mod\u00fclerli\u011fi art\u0131rabilir ve bir fonksiyonun ana i\u015f mant\u0131\u011f\u0131n\u0131, loglama, zamanlama, yetkilendirme veya \u00f6nbellekleme gibi yan endi\u015felerden ay\u0131rabiliriz. Bu ayr\u0131m, kodunuzu daha okunabilir, anla\u015f\u0131l\u0131r ve gelecekteki bak\u0131mlar i\u00e7in daha esnek hale getirir. Parametre alan decorator'lar ile daha esnek \u00e7\u00f6z\u00fcmler \u00fcretebilir, zincirleme decorator'lar ile de bir fonksiyona birden fazla i\u015flevsellik katman\u0131 ekleyebilirsiniz. Ayr\u0131ca, <code>functools.wraps<\/code> gibi yard\u0131mc\u0131 ara\u00e7lar\u0131n \u00f6nemini ve s\u0131n\u0131f tabanl\u0131 decorator'lar\u0131n potansiyelini de ke\u015ffettik.<\/p>\n<p>Unutmay\u0131n ki her g\u00fc\u00e7l\u00fc ara\u00e7 gibi, decorator'lar\u0131 da bilin\u00e7li bir \u015fekilde kullanmak gerekir. Metadatan\u0131n korunmas\u0131, performans etkilerinin fark\u0131nda olunmas\u0131 ve zincirleme kullan\u0131mlar\u0131n dikkatlice planlanmas\u0131, kar\u015f\u0131la\u015fabilece\u011finiz yayg\u0131n zorluklar\u0131n \u00fcstesinden gelmenizi sa\u011flayacakt\u0131r. Python ekosisteminde, \u00f6zellikle web framework'lerinde (Flask, Django) ve \u00e7e\u015fitli k\u00fct\u00fcphanelerde (Celery, SQLAlchemy), decorator'lar yayg\u0131n olarak kullan\u0131l\u0131r. Bu ara\u00e7lar\u0131 anlamak ve etkili bir \u015fekilde kullanmak, daha iyi bir Python geli\u015ftiricisi olman\u0131n anahtarlar\u0131ndan biridir.<\/p>\n<p>Art\u0131k Python decorator'lar\u0131n\u0131n temellerine ve ileri d\u00fczey kullan\u0131mlar\u0131na hakim oldu\u011funuza g\u00f6re, kendi projelerinizde bu g\u00fc\u00e7l\u00fc yap\u0131y\u0131 denemekten \u00e7ekinmeyin. Kodunuzun nas\u0131l daha temiz, daha verimli ve daha profesyonel bir g\u00f6r\u00fcn\u00fcme kavu\u015ftu\u011funa \u015fa\u015f\u0131racaks\u0131n\u0131z. \u0130yi kodlamalar!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Decorator kullanman\u0131n ana avantaj\u0131 nedir?<\/strong><\/p>\n<p>Decorator kullanman\u0131n ana avantaj\u0131, fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftirmek veya geni\u015fletmek i\u00e7in kod tekrar\u0131n\u0131 azaltmas\u0131 ve mod\u00fclerli\u011fi art\u0131rmas\u0131d\u0131r. Ana fonksiyonun mant\u0131\u011f\u0131n\u0131 de\u011fi\u015ftirmeden loglama, yetkilendirme, \u00f6nbellekleme gibi \u00e7apraz kesen i\u015flevleri eklemenizi sa\u011flar, bu da kodu daha temiz ve bak\u0131m\u0131 kolay hale getirir.<\/p>\n<p><strong>2. <code>@<\/code> sembol\u00fc olmadan decorator kullanabilir miyim?<\/strong><\/p>\n<p>Evet, kullanabilirsiniz. <code>@decorator_ad\u0131<\/code> s\u00f6z dizimi asl\u0131nda sadece bir sentaktik \u015fekerdir. <code>def fonksiyon(): ...<\/code> ve <code>fonksiyon = decorator_ad\u0131(fonksiyon)<\/code> yazmaya e\u015fde\u011ferdir. Bu manuel atama y\u00f6ntemi, <code>decorator_ad\u0131<\/code> fonksiyonunu do\u011frudan \u00e7a\u011f\u0131rarak orijinal <code>fonksiyon<\/code>u dekore eder.<\/p>\n<p><strong>3. <code>functools.wraps<\/code> neden \u00f6nemlidir?<\/strong><\/p>\n<p><code>functools.wraps<\/code> decorator'\u0131, bir fonksiyonu dekore etti\u011finizde orijinal fonksiyonun metadatas\u0131n\u0131n (ad\u0131, dok\u00fcmantasyon dizgisi, arg\u00fcmanlar\u0131 vb.) kaybolmas\u0131n\u0131 engeller. Bu, hata ay\u0131klama ara\u00e7lar\u0131n\u0131n, test framework'lerinin ve dok\u00fcmantasyon olu\u015fturucular\u0131n\u0131n dekore edilmi\u015f fonksiyon hakk\u0131nda do\u011fru bilgilere eri\u015fmesini sa\u011flar ve kodunuzun okunabilirli\u011fini art\u0131r\u0131r.<\/p>\n<p><strong>4. S\u0131n\u0131flar decorator olarak kullan\u0131labilir mi?<\/strong><\/p>\n<p>Evet, s\u0131n\u0131flar\u0131 da decorator olarak kullanabilirsiniz. Bir s\u0131n\u0131f\u0131n decorator olarak i\u015flev g\u00f6rebilmesi i\u00e7in, bir \u00f6rnek (instance) olarak \u00e7a\u011fr\u0131labilir olmas\u0131, yani <code>__call__<\/code> metodunu uygulamas\u0131 gerekir. Bu y\u00f6ntem, decorator'\u0131n durum (state) tutmas\u0131 gereken veya daha karma\u015f\u0131k yap\u0131land\u0131rmalara ihtiya\u00e7 duyan durumlarda kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><strong>5. Decorator'lar\u0131n performans \u00fczerinde bir etkisi var m\u0131?<\/strong><\/p>\n<p>Evet, her decorator bir fonksiyon \u00e7a\u011fr\u0131s\u0131n\u0131n \u00fczerine ek bir katman ekledi\u011fi i\u00e7in teorik olarak k\u00fc\u00e7\u00fck bir performans maliyeti getirir. Ancak \u00e7o\u011fu durumda, bu maliyet ihmal edilebilir d\u00fczeydedir ve decorator'lar\u0131n sa\u011flad\u0131\u011f\u0131 kod temizli\u011fi ve yeniden kullan\u0131labilirlik avantajlar\u0131 bu k\u00fc\u00e7\u00fck performans kayb\u0131n\u0131 fazlas\u0131yla telafi eder. Performans\u0131n kritik oldu\u011fu yerlerde, fonksiyonlar\u0131n\u0131z\u0131 <code>timeit<\/code> gibi ara\u00e7larla \u00f6l\u00e7erek olas\u0131 etkileri de\u011ferlendirebilirsiniz.<\/p>\n<section>\n<h2>Mobil Uyumlu Tasar\u0131m Notu<\/h2>\n<p>Bu makaledeki i\u00e7erik, mobil cihazlarda okunabilirli\u011fi art\u0131rmak amac\u0131yla basit ve ak\u0131c\u0131 bir yap\u0131ya sahiptir. Paragraflar, ba\u015fl\u0131klar, kod bloklar\u0131 ve listeler gibi temel HTML \u00f6\u011feleri, \u00e7o\u011fu taray\u0131c\u0131 taraf\u0131ndan varsay\u0131lan olarak mobil dostu bir \u015fekilde i\u015flenir. Ancak, g\u00f6rsel tutarl\u0131l\u0131k ve daha iyi bir kullan\u0131c\u0131 deneyimi i\u00e7in, bu t\u00fcr bir makalenin CSS ile daha da optimize edilmesi \u00f6nemlidir. \u00d6rne\u011fin, kod bloklar\u0131n\u0131n yatay kayd\u0131rma \u00e7ubuklar\u0131 ile ta\u015fmas\u0131n\u0131 \u00f6nlemek, yaz\u0131 tiplerini ve sat\u0131r aral\u0131klar\u0131n\u0131 ayg\u0131t boyutuna g\u00f6re dinamik olarak ayarlamak gibi iyile\u015ftirmeler yap\u0131labilir.<\/p>\n<p>A\u015fa\u011f\u0131da, bu makale i\u00e7eri\u011finde kullan\u0131lan baz\u0131 HTML \u00f6\u011felerinin mobil cihazlarda daha iyi g\u00f6r\u00fcnmesini sa\u011flayabilecek \u00f6rnek bir CSS <code><\/p>\n<style><\/code> blo\u011fu sunulmu\u015ftur. Bu <code><\/p>\n<style><\/code> blo\u011fu normalde HTML belgesinin <code><head><\/code> k\u0131sm\u0131na yerle\u015ftirilir, ancak talimatlara uygun olarak <code><body><\/code> i\u00e7inde verilmektedir.<\/p>\n<pre><code class=\"language-html\">\n<style>\n  \/* Temel Ayarlar *\/\n  body {\n    font-family: Arial, sans-serif;\n    line-height: 1.6;\n    color: #333;\n    margin: 0;\n    padding: 15px; \/* Mobil cihazlarda kenar bo\u015flu\u011fu *\/\n    background-color: #f9f9f9;\n  }\n\n  h2, h3 {\n    color: #2c3e50;\n    margin-top: 1.5em;\n    margin-bottom: 0.8em;\n  }\n\n  p {\n    margin-bottom: 1em;\n    text-align: justify; \/* Okunurluk i\u00e7in iki yana yasla *\/\n  }\n\n  \/* Kod Bloklar\u0131 i\u00e7in Stil *\/\n  pre {\n    background-color: #eee;\n    padding: 10px;\n    border-radius: 5px;\n    overflow-x: auto; \/* Yatay kayd\u0131rma \u00e7ubu\u011fu ekle *\/\n    margin-bottom: 1em;\n  }\n\n  code {\n    font-family: 'Courier New', monospace;\n    color: #c7254e;\n    background-color: #f9f2f4;\n    padding: 2px 4px;\n    border-radius: 3px;\n    white-space: pre-wrap; \/* Sat\u0131r sonlar\u0131nda kodun k\u0131r\u0131lmas\u0131 *\/\n    word-wrap: break-word; \/* Uzun kelimeleri k\u0131rma *\/\n  }\n  \n  pre code {\n    display: block; \/* pre i\u00e7indeki code'u blok yap *\/\n    padding: 0;\n    background-color: transparent;\n    color: #333;\n    white-space: pre; \/* pre i\u00e7indeki code i\u00e7in orijinal beyaz bo\u015fluk *\/\n  }\n\n  \/* Blok Al\u0131nt\u0131lar\u0131 (Uzman \u0130pu\u00e7lar\u0131) *\/\n  blockquote {\n    background: #e0f2f7;\n    border-left: 5px solid #2196f3;\n    margin: 1.5em 0;\n    padding: 0.5em 1em;\n    color: #34495e;\n    font-style: italic;\n  }\n\n  \/* Listeler *\/\n  ul, ol {\n    margin-bottom: 1em;\n    padding-left: 20px;\n  }\n\n  li {\n    margin-bottom: 0.5em;\n  }\n\n  \/* Mobil Cihazlara \u00d6zel Ayarlamalar (Media Queries) *\/\n  @media (max-width: 768px) {\n    body {\n      padding: 10px; \/* Daha k\u00fc\u00e7\u00fck ekranlarda daha az kenar bo\u015flu\u011fu *\/\n      font-size: 16px; \/* Okunurluk i\u00e7in varsay\u0131lan font boyutunu art\u0131r *\/\n    }\n\n    h2 {\n      font-size: 1.8em;\n    }\n\n    h3 {\n      font-size: 1.4em;\n    }\n\n    pre, blockquote {\n      margin: 1em 0;\n      padding: 0.5em;\n    }\n  }\n\n  @media (max-width: 480px) {\n    body {\n      padding: 8px;\n      font-size: 15px;\n    }\n\n    h2 {\n      font-size: 1.5em;\n    }\n\n    h3 {\n      font-size: 1.2em;\n    }\n\n    \/* Daha k\u00fc\u00e7\u00fck ekranlarda kod bloklar\u0131n\u0131 daha kompakt yap *\/\n    pre {\n      padding: 8px;\n    }\n  }\n<\/style>\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS, <code>body<\/code> i\u00e7in genel ayarlar, kod bloklar\u0131 i\u00e7in \u00f6zel stiller ve <code>blockquote<\/code> i\u00e7in ipucu g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc sa\u011flar. <code>@media<\/code> kurallar\u0131, ekran geni\u015fli\u011fi belirli bir e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde (\u00f6rne\u011fin 768px veya 480px) yaz\u0131 tipi boyutlar\u0131n\u0131, kenar bo\u015fluklar\u0131n\u0131 ve dolgular\u0131 ayarlayarak i\u00e7eri\u011fin mobil cihazlarda daha rahat okunmas\u0131n\u0131 hedefler.<\/p>\n<\/section>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Python programlama dilinde kodunuzu daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay hale getirmenin yollar\u0131n\u0131 m\u0131 ar\u0131yorsunuz? \u00d6zellikle s\u00fcrekli tekrar&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-32078","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 Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu<\/title>\n<meta name=\"description\" content=\"Python programlama dilinde kodunuzu daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay hale getirmenin yollar\u0131n\u0131 m\u0131 ar\u0131yorsunuz? \u00d6zellikle s\u00fcrekli tekrar eden g\u00f6revler, \u00f6rne\u011fin loglama, yetkilendirme veya bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7me gibi durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, kod tekrar\u0131n\u0131 nas\u0131l minimuma indirece\u011finizi merak ediyor olabilirsiniz. \u0130\u015fte bu noktada Python decorator&#039;lar\u0131 devreye giriyor. Decorator&#039;lar, mevcut fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftiren veya geni\u015fleten, ayn\u0131 zamanda kodun kendisini de\u011fi\u015ftirmek zorunda kalmadan yeni i\u015flevsellik eklemenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir metaprogramlama arac\u0131d\u0131r. Bu makalede, Python decorator&#039;lar\u0131n\u0131n temellerinden ileri d\u00fczey kullan\u0131mlar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan kar\u015f\u0131la\u015fabilece\u011finiz zorluklara kadar her \u015feyi detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ad\u0131m ad\u0131m \u00f6rneklerle, decorator&#039;lar\u0131n g\u00fcc\u00fcn\u00fc ve esnekli\u011fini ke\u015ffedece\u011fiz.\" \/>\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-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu\" \/>\n<meta property=\"og:description\" content=\"Python programlama dilinde kodunuzu daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay hale getirmenin yollar\u0131n\u0131 m\u0131 ar\u0131yorsunuz? \u00d6zellikle s\u00fcrekli tekrar eden g\u00f6revler, \u00f6rne\u011fin loglama, yetkilendirme veya bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7me gibi durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, kod tekrar\u0131n\u0131 nas\u0131l minimuma indirece\u011finizi merak ediyor olabilirsiniz. \u0130\u015fte bu noktada Python decorator&#039;lar\u0131 devreye giriyor. Decorator&#039;lar, mevcut fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftiren veya geni\u015fleten, ayn\u0131 zamanda kodun kendisini de\u011fi\u015ftirmek zorunda kalmadan yeni i\u015flevsellik eklemenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir metaprogramlama arac\u0131d\u0131r. Bu makalede, Python decorator&#039;lar\u0131n\u0131n temellerinden ileri d\u00fczey kullan\u0131mlar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan kar\u015f\u0131la\u015fabilece\u011finiz zorluklara kadar her \u015feyi detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ad\u0131m ad\u0131m \u00f6rneklerle, decorator&#039;lar\u0131n g\u00fcc\u00fcn\u00fc ve esnekli\u011fini ke\u015ffedece\u011fiz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T09:31:35+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\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu\",\"datePublished\":\"2025-10-17T09:31:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/\"},\"wordCount\":3585,\"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-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/\",\"name\":\"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-17T09:31:35+00:00\",\"description\":\"Python programlama dilinde kodunuzu daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay hale getirmenin yollar\u0131n\u0131 m\u0131 ar\u0131yorsunuz? \u00d6zellikle s\u00fcrekli tekrar eden g\u00f6revler, \u00f6rne\u011fin loglama, yetkilendirme veya bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7me gibi durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, kod tekrar\u0131n\u0131 nas\u0131l minimuma indirece\u011finizi merak ediyor olabilirsiniz. \u0130\u015fte bu noktada Python decorator'lar\u0131 devreye giriyor. Decorator'lar, mevcut fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftiren veya geni\u015fleten, ayn\u0131 zamanda kodun kendisini de\u011fi\u015ftirmek zorunda kalmadan yeni i\u015flevsellik eklemenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir metaprogramlama arac\u0131d\u0131r. Bu makalede, Python decorator'lar\u0131n\u0131n temellerinden ileri d\u00fczey kullan\u0131mlar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan kar\u015f\u0131la\u015fabilece\u011finiz zorluklara kadar her \u015feyi detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ad\u0131m ad\u0131m \u00f6rneklerle, decorator'lar\u0131n g\u00fcc\u00fcn\u00fc ve esnekli\u011fini ke\u015ffedece\u011fiz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu\"}]},{\"@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 Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu","description":"Python programlama dilinde kodunuzu daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay hale getirmenin yollar\u0131n\u0131 m\u0131 ar\u0131yorsunuz? \u00d6zellikle s\u00fcrekli tekrar eden g\u00f6revler, \u00f6rne\u011fin loglama, yetkilendirme veya bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7me gibi durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, kod tekrar\u0131n\u0131 nas\u0131l minimuma indirece\u011finizi merak ediyor olabilirsiniz. \u0130\u015fte bu noktada Python decorator'lar\u0131 devreye giriyor. Decorator'lar, mevcut fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftiren veya geni\u015fleten, ayn\u0131 zamanda kodun kendisini de\u011fi\u015ftirmek zorunda kalmadan yeni i\u015flevsellik eklemenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir metaprogramlama arac\u0131d\u0131r. Bu makalede, Python decorator'lar\u0131n\u0131n temellerinden ileri d\u00fczey kullan\u0131mlar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan kar\u015f\u0131la\u015fabilece\u011finiz zorluklara kadar her \u015feyi detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ad\u0131m ad\u0131m \u00f6rneklerle, decorator'lar\u0131n g\u00fcc\u00fcn\u00fc ve esnekli\u011fini ke\u015ffedece\u011fiz.","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-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/","og_locale":"tr_TR","og_type":"article","og_title":"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu","og_description":"Python programlama dilinde kodunuzu daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay hale getirmenin yollar\u0131n\u0131 m\u0131 ar\u0131yorsunuz? \u00d6zellikle s\u00fcrekli tekrar eden g\u00f6revler, \u00f6rne\u011fin loglama, yetkilendirme veya bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7me gibi durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, kod tekrar\u0131n\u0131 nas\u0131l minimuma indirece\u011finizi merak ediyor olabilirsiniz. \u0130\u015fte bu noktada Python decorator'lar\u0131 devreye giriyor. Decorator'lar, mevcut fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftiren veya geni\u015fleten, ayn\u0131 zamanda kodun kendisini de\u011fi\u015ftirmek zorunda kalmadan yeni i\u015flevsellik eklemenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir metaprogramlama arac\u0131d\u0131r. Bu makalede, Python decorator'lar\u0131n\u0131n temellerinden ileri d\u00fczey kullan\u0131mlar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan kar\u015f\u0131la\u015fabilece\u011finiz zorluklara kadar her \u015feyi detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ad\u0131m ad\u0131m \u00f6rneklerle, decorator'lar\u0131n g\u00fcc\u00fcn\u00fc ve esnekli\u011fini ke\u015ffedece\u011fiz.","og_url":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-17T09:31:35+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\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu","datePublished":"2025-10-17T09:31:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/"},"wordCount":3585,"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-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/","url":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/","name":"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-17T09:31:35+00:00","description":"Python programlama dilinde kodunuzu daha mod\u00fcler, okunabilir ve bak\u0131m\u0131 kolay hale getirmenin yollar\u0131n\u0131 m\u0131 ar\u0131yorsunuz? \u00d6zellikle s\u00fcrekli tekrar eden g\u00f6revler, \u00f6rne\u011fin loglama, yetkilendirme veya bir fonksiyonun \u00e7al\u0131\u015fma s\u00fcresini \u00f6l\u00e7me gibi durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, kod tekrar\u0131n\u0131 nas\u0131l minimuma indirece\u011finizi merak ediyor olabilirsiniz. \u0130\u015fte bu noktada Python decorator'lar\u0131 devreye giriyor. Decorator'lar, mevcut fonksiyonlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftiren veya geni\u015fleten, ayn\u0131 zamanda kodun kendisini de\u011fi\u015ftirmek zorunda kalmadan yeni i\u015flevsellik eklemenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir metaprogramlama arac\u0131d\u0131r. Bu makalede, Python decorator'lar\u0131n\u0131n temellerinden ileri d\u00fczey kullan\u0131mlar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan kar\u015f\u0131la\u015fabilece\u011finiz zorluklara kadar her \u015feyi detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ad\u0131m ad\u0131m \u00f6rneklerle, decorator'lar\u0131n g\u00fcc\u00fcn\u00fc ve esnekli\u011fini ke\u015ffedece\u011fiz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-decoratorlari-fonksiyonlari-guclendirmenin-yolu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python Decoratorlar\u0131: Fonksiyonlar\u0131 G\u00fc\u00e7lendirmenin Yolu"}]},{"@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\/32078","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=32078"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32078\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32078"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32078"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}