Python Dekoratörleri: Sarma ve Değiştirme İşlevleri

İşlev davranışını dinamik olarak değiştirmek için Python dekoratörlerini öğrenin. Dekoratörlerde sarmalayıcı işlevlerini, @ sözdizimini ve argümanları işlemeyi anlayın.

Editör'de deneyin

Genel Bakış

Dekoratörler Python'un en zarif ve güçlü tasarım desenlerinden biridir. Geliştiricilerin bir işlevin, yöntemin veya sınıfın davranışını, kaynak kodunu kalıcı olarak değiştirmeden değiştirmesine veya genişletmesine olanak tanır. Bir dekoratörün, ön ve son işleme adımlarını yürütmek için bir işlevi başka bir işlevin içine sardığını düşünün. Bu, dekoratörleri günlüğe kaydetme, zamanlama, doğrulama veya erişim kontrolü gibi kesişen konuları uygulamak için mükemmel kılar.

Dekoratörler özünde Python fonksiyonlarının birinci sınıf vatandaşlar olması nedeniyle çalışırlar. Bu, işlevlerin diğer işlevlere argüman olarak aktarılabileceği, işlevlerden döndürülebileceği ve değişkenlere atanabileceği anlamına gelir. Bir dekoratör, başka bir işlevi argüman olarak alan, orijinal işlevi bazı ekstra mantıklarla birlikte yürüten iç içe geçmiş bir sarmalayıcı işlevi tanımlayan ve orijinalin yerine bu sarmalayıcı işlevini döndüren bir işlevdir.

Dekoratörlerin uygulanmasını basit ve temiz hale getirmek için Python, hedef işlev tanımının hemen üstüne yerleştirilen `@decorator_name` sözdizimsel şekerini sağlar. Python, dekore edilmiş işlevi çağırırken bunun yerine sarmalayıcıyı çağırır. İşlev parametreleri kabul ediyorsa sarmalayıcının rastgele bağımsız değişkenleri ('*args' ve '**kwargs') kabul etmesi ve bunları doğru şekilde iletmesi gerekir. Dekoratörleri anlamak, son derece modüler, temiz ve KURU (Kendinizi Tekrar Etmeyin) kod yazmanıza olanak tanır.

Kod ve Yürütme Çıkışı

İşlev yürütme ayrıntılarını izleyen ve günlüğe kaydeden özel bir dekoratör.

decorators.py
Editör'de deneyin
def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
Terminal Çıkışı
Calling multiply with args: (5, 4)
multiply returned: 20

Adım Adım Uygulama

  • Çalışma zamanı ölçümlerinin performans izleyicilerine kaydedilmesi
  • Rotalarda kimlik doğrulama ve yetkilendirme kontrollerini zorunlu kılma
  • Pahalı hesaplama sonuçlarını önbelleğe almak veya not etmek

Sıkça Sorulan Sorular

Dekoratörler tartışmaları nasıl ele alıyor?

Yuvalanmış sarmalayıcı işlevinde *args ve **kwargs kullanılarak, konumsal veya anahtar sözcük parametrelerinin alınmasına ve sarılmış işleve iletilmesine olanak sağlanır.

Tek bir işleve birden fazla dekoratör uygulayabilir misiniz?

Evet, bunları üst üste koyabilirsiniz. Yukarıdan aşağıya doğru (en içten en dıştaki sargıya) sırayla yürütülürler.

İlgili Konular

Önerilen Python Kaynakları

İlgili etkileşimli eğitimler, yardımcı sayfalar ve kod karşılaştırmalarıyla bilginizi genişletin.