0Pricing
Python Academy · Ders

Özel Dekoratörler Yazma

Sarmalayıcı işlevleri ve functools.wraps kullanarak dekoratörler oluşturun.

Özel Dekoratörler Yazma, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

Giriş

Dekoratörler, diğer işlevleri sarmalayarak özgün işlevi değiştirmeden öncesine veya sonrasına davranış ekleyen işlevlerdir.

Dekoratör Nedir?

Bir işlevin üzerindeki @decorator, şu söz dizimi kısaltmasına karşılık gelir: func = decorator(func). Dekoratör, işlevi alır ve bir sarmalayıcı döndürür.
def shout(func):
    def wrapper(*a, **kw):
        result = func(*a, **kw)
        return str(result).upper()
    return wrapper
@shout
def greet(name): return f'hello {name}'
print(greet('Alice'))

Sarmalayıcı Deseni

Sarmalayıcı işlev, özgün işlevle aynı imzaya sahiptir. Özgün işlevi kendi içinde çağırır ve çevresine davranış ekler.
def timer(func):
    import time
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f'{func.__name__} took {time.time()-start:.4f}s')
        return result
    return wrapper
@timer
def slow(): import time; time.sleep(0.01)
slow()

functools.wraps

Sarmalayıcı üzerinde kullanılan @wraps(func), özgün işlevin __name__, __doc__ ve __annotations__ bilgilerini korur.
from functools import wraps
def log(func):
    @wraps(func)
    def wrapper(*a, **kw):
        print(f'calling {func.__name__}')
        return func(*a, **kw)
    return wrapper
@log
def add(a, b): return a + b
print(add.__name__)
add(1, 2)

Bağımsız Değişkenli Dekoratör

Bağımsız değişken alan bir dekoratör, bir katman daha sarmalama gerektirir: bağımsız değişkenleri alan ve dekoratörü döndüren bir fabrika işlevi.
def repeat(n):
    def decorator(func):
        from functools import wraps
        @wraps(func)
        def wrapper(*a, **kw):
            for _ in range(n): func(*a, **kw)
        return wrapper
    return decorator
@repeat(3)
def hi(): print('hi')
hi()

Dekoratörleri Katmanlama

Birden çok dekoratör alttan üste doğru katmanlanır: @d2 @d1, func = d2(d1(func)) anlamına gelir. En dıştaki (üstteki) dekoratör en son çalışır.
def bold(f):
    from functools import wraps
    @wraps(f)
    def w(*a,**k): return '<b>' + f(*a,**k) + '</b>'
    return w
def italic(f):
    from functools import wraps
    @wraps(f)
    def w(*a,**k): return '<i>' + f(*a,**k) + '</i>'
    return w
@bold
@italic
def text(): return 'hello'
print(text())

Sınıf Tabanlı Dekoratör

__call__ yöntemine sahip bir sınıf dekoratör olabilir. Çağrılar arasında durumu saklar.
class Counter:
    def __init__(self, func): self.func,self.count=func,0
    def __call__(self, *a, **kw):
        self.count+=1
        return self.func(*a, **kw)
@Counter
def greet(name): return f'hi {name}'
greet('Alice'); greet('Bob')
print(greet.count)

Önbelleğe Alma Dekoratörü

Yeniden hesaplamayı önlemek için önceki sonuçları önbelleğe alın: if args in cache: return cache[args]. functools.lru_cache bunu yerleşik olarak yapar.
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
    if n < 2: return n
    return fib(n-1) + fib(n-2)
print(fib(30))

Yetkilendirme Dekoratörü

Dekoratörler erişim denetiminde yaygın olarak kullanılır: işlevi çalıştırmadan önce kullanıcının oturum açıp açmadığını denetleyin.
def requires_auth(func):
    from functools import wraps
    @wraps(func)
    def wrapper(user, *a, **kw):
        if not user.get('authenticated'):
            raise PermissionError('Not authenticated')
        return func(user, *a, **kw)
    return wrapper
@requires_auth
def dashboard(user): return 'Welcome!'
try: dashboard({'authenticated': False})
except PermissionError as e: print(e)

Yeniden Deneme Dekoratörü

Başarısızlık durumunda yeniden denemek için bir işlevi sarmalayın: for _ in range(retries): try: return func() except Exception: pass
import random
from functools import wraps
def retry(times=3):
    def dec(func):
        @wraps(func)
        def wrapper(*a, **kw):
            for i in range(times):
                try: return func(*a, **kw)
                except Exception as e:
                    if i==times-1: raise
        return wrapper
    return dec
@retry(3)
def flaky():
    if random.random()<0.7: raise ValueError
    return 'ok'
try: print(flaky())
except ValueError: print('failed')

Dekoratörler için En İyi Uygulamalar

Her zaman @functools.wraps kullanın. Dekoratörleri tek bir amaca odaklayın. Ekledikleri davranışı belgeleyin. Dekoratörü, dekorasyon uygulanmış işlevden ayrı olarak sınayın.
from functools import wraps
def validate_positive(func):
    @wraps(func)
    def wrapper(x, *a, **kw):
        if x <= 0: raise ValueError(f'{x} must be positive')
        return func(x, *a, **kw)
    return wrapper
@validate_positive
def sqrt(x): return x**0.5
print(sqrt(9))

Hızlı Yoklama

Bir sarmalayıcıya uygulandığında @functools.wraps(func) ne yapar?

Özet

Dekoratörler: func = decorator(func). wrapper(*args, **kwargs) kullanılır. @wraps, üst verileri korur. Parametreli dekoratörler bir katman daha ekler. Birden çok @decorators ile katmanlama yapılır.

Devam Edin

Mükemmel ilerliyorsunuz! Bir sonraki kavramda ustalaşmak için devam edin.

Sıkça Sorulan Sorular

“Özel Dekoratörler Yazma” dersi ücretsiz mi?

Evet — “Özel Dekoratörler Yazma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“Özel Dekoratörler Yazma” dersinde ne öğreneceğim?

Sarmalayıcı işlevleri ve functools.wraps kullanarak dekoratörler oluşturun. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Özel Dekoratörler Yazma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Birinci Sınıf Nesneler Olarak İşlevler
  2. Özel Dekoratörler Yazma
  3. @property Dekoratörü
  4. @classmethod ve @staticmethod
← Python Academy Sayfasına Dön