Python Dekoratörler ve Dekoratör Tasarım Deseni: Temel Farklılıklar
Python dekoratörlerini ve klasik dekoratör tasarım modelini karşılaştırın. Çalıştırılabilir kodla tanım zamanı işlev sarma ve çalışma zamanı dinamik nesne bileşimi arasındaki farkları anlayın.
Python dekoratörleri ve dekoratör tasarım modeli aynı adı ve davranışı genişletmek için kodu "sarma" genel konseptini paylaşsa da, programlamada tamamen farklı yapıları ve felsefeleri temsil ederler.
Python dekoratörü bir dil özelliğidir; bir işlevi, yöntemi veya sınıfı tanım zamanında sarmanıza olanak tanıyan sözdizimsel şekerdir. Modül içe aktarıldığında veya tanımlandığında yürütülen ve uygulama çalışmasının geri kalanında bu işlevin nasıl davranacağını değiştiren bir metaprogramlama biçimidir.
Başlangıçta Gang of Four (GoF) tarafından tanımlanan Dekoratör Tasarım Modeli, nesne yönelimli bir yapısal tasarım modelidir. Sarma sınıfları ve dinamik kompozisyon kullanarak, aynı sınıftaki diğer nesneleri etkilemeden, çalışma zamanında bireysel nesnelere dinamik olarak sorumluluklar eklemek için tasarlanmıştır.
Özellik Karşılaştırma Matrisi
| Feature | Python | Other Language |
|---|---|---|
| Temel Konsept | İşlevleri/sınıfları paketlemek için dil düzeyinde sözdizimsel şeker. | Tek tek nesnelere dinamik olarak davranış eklemek için tasarım deseni. |
| Yürütme Süresi | Tanımlama süresi (modül yüklendiğinde bir kez çalışır). | Çalışma zamanı (programın yürütülmesi sırasında dinamik olarak başlatılır). |
| Hedef Varlık | İşlevler, yöntemler veya sınıfların tamamı (statik kapsam). | Belirli nesne örnekleri (dinamik kapsam). |
| Uygulama Yöntemi | '@decorator' sözdizimini kullanan kapatmalar ve yardımcı işlevler. | Sınıf mirası, arayüz hizalaması ve nesne kompozisyonu. |
Syntax & Idiom Comparisons
01.Python Dekoratörü: Fonksiyon Sarmalayıcı (Tanım-Zaman)
Python dekoratörleri çağrıları engellemek için birinci sınıf işlevlerden yararlanır. `@my_decorator` yazdığınızda Python, dekore edilen işlevi dekoratör işlevinize aktarır ve döndürülen sarmalayıcı işlevi orijinal işlev adına bağlar.
Bu örnekte, "@log_call" dekoratörü, ne zaman yürütüldüğünü ve ne döndürdüğünü izlemek için basit bir işlevi sarar. Bu sarmanın, işlev tanımlandığı anda sabitlendiğini unutmayın.
def log_call(func):
def wrapper(*args, **kwargs):
print(f"[LOG] Executing '{func.__name__}' with args {args}")
result = func(*args, **kwargs)
print(f"[LOG] '{func.__name__}' returned: {result}")
return result
return wrapper
@log_call
def add(a, b):
return a + b
# The wrapping occurs once at definition time
print("Result of add(5, 7):", add(5, 7))// Decorators in Python are syntactic sugar for function wrappers:
// add = log_call(add)
// They exist primarily to avoid duplicate boilerplate for logging, timing, and auth.02.Dekoratör Tasarım Modeli: Nesne Sarmalayıcı (Çalışma Zamanı Kompozisyonu)
Klasik Dekoratör Tasarım Deseni sınıf kompozisyonunu kullanır. Bir temel bileşen sınıfınız ve bu temel bileşeni saran dekoratör sınıflarınız var. Çalışma zamanında, özelleştirilmiş bir nesneyi dinamik olarak oluşturmak için bu oluşturucuları bir araya zincirlersiniz.
Burada klasik bir Kahve dekoratör sistemi uyguluyoruz. Temel bir Coffee nesnesini MilkDecorator'ın içine sarabilir ve bunu bir SugarDecorator'ın içine sarabilir ve çalışma zamanında nihai maliyeti dinamik olarak hesaplayabiliriz.
class Coffee:
def get_cost(self):
return 5.0
def get_description(self):
return "Simple Coffee"
class MilkDecorator:
def __init__(self, coffee):
self.coffee = coffee
def get_cost(self):
return self.coffee.get_cost() + 1.5
def get_description(self):
return self.coffee.get_description() + ", Milk"
class SugarDecorator:
def __init__(self, coffee):
self.coffee = coffee
def get_cost(self):
return self.coffee.get_cost() + 0.5
def get_description(self):
return self.coffee.get_description() + ", Sugar"
# Chaining wrappers dynamically at runtime
my_drink = Coffee()
my_drink = MilkDecorator(my_drink)
my_drink = SugarDecorator(my_drink)
print("Drink description:", my_drink.get_description())
print("Total Cost: $", my_drink.get_cost())// Standard OO languages (like Java) require shared interfaces:
// interface Coffee { double getCost(); }
// class SimpleCoffee implements Coffee { ... }
// class MilkDecorator implements Coffee { ... }
// Python's duck typing allows dynamic composition without interfaces.Karar ve Özet
Uygulamanız genelinde işlevlere veya rotalara kesişen konuları (günlüğe kaydetme, zamanlama, kimlik doğrulama, önbelleğe alma veya giriş doğrulama gibi) uygulamak istediğinizde Python dekoratörlerini (@decorator) kullanın.
Özellikle birden fazla isteğe bağlı sarmalayıcı sınıfını rastgele sıralarda birleştirirken, çalışma zamanında dinamik olarak bireysel nesne örneklerinden davranışları eklemeniz veya ayırmanız gerektiğinde Dekoratör Tasarım Desenini kullanın.
Sıkça Sorulan Sorular
Wikipedia sayfası neden Python dekoratörlerinin dekoratör modeli olmadığını söylüyor?
Çünkü standart Python dekoratörleri, işlevleri ve sınıf tanımlarını derleme/tanımlama zamanında sarar ve bu işlevin tüm örneklerini etkiler. Klasik tasarım deseni, bireysel nesne örneklerini çalışma zamanında dinamik olarak sarar.
GoF Dekoratör Kalıbı Python'da faydalı mıdır?
Evet, ancak Python'un ördek yazımı, dekoratörlerin resmi bir temel arayüzden miras alması gerekmediğinden, uygulamayı Java veya C++ gibi statik olarak yazılan dillere göre çok daha basit hale getirir.
Diğer Karşılaştırmalar
Önerilen Python Kaynakları
İlgili etkileşimli eğitimler, yardımcı sayfalar ve kod karşılaştırmalarıyla bilginizi genişletin.
Python Dekoratörleri
İş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.
Python'da Dekoratörler Nasıl Oluşturulur ve Kullanılır
Python'da dekoratörlerin nasıl yazılacağını ve uygulanacağını öğrenin. Sarma işlevlerinde, davranışı değiştirmede, bağımsız değişkenleri yönetmede ve sarmalarla meta verileri korumada uzmanlaşın.
Python Regex Desenleri (yeniden modül) Hile Sayfası
Python düzenli ifadeleri için başvuru kılavuzu. Eşleştirme, arama, tümünü bulma, alt ve temel normal ifade kalıplarını öğrenin.