Sınıf dekoratörü, bir sınıfı argüman olarak alan ve ya değiştirilmiş ya da tamamen yeni bir sınıf döndüren bir işlevdir. Bu sayede dinamik olarak yöntemler ekleyebilir, mevcut yöntemlerin davranışını değiştirebilir veya hatta orijinal sınıfın işlevselliğini genişleten bir alt sınıf döndürebilirsiniz.
def add_repr(cls): def __repr__(self): return f'<{cls.__name__}: {self.__dict__}>' cls.__repr__ = __repr__ return cls @add_repr class Point: def __init__(self, x, y): self.x = x self.y = y p = Point(3, 4) print(p) # <Point: {'x': 3, 'y': 4}>
add_repr dekoratörü, uygulandığı tüm sınıflara dinamik olarak __repr__ yöntemini ekler.*args ve **kwargs argümanlarını desteklemiyorsa, hatalar alabilirsiniz.İki sınıf dekoratörünü üst üste uygularsak ne olur? Uygulama sırası her zaman belirgin midir?
Dekoratörler "aşağıdan yukarıya" uygulanır: önce sınıf bildiriminden hemen üstte bulunan dekoratör, ardından bir sonraki ve devam eder. Sıra ÇOK ÖNEMLİDİR, çünkü ilk dekoratörün sonucu ikinciye aktarılır ve bu şekilde devam eder.
@dec1 @dec2 class Test: ... # Eşdeğer: # Test = dec1(dec2(Test))
Hikaye
E-ticaret uygulamasında sınıf yöntemlerini kaydetmek istediler ama dekoratörden yanlış bir nesne döndürdüler ve yöntemler sınıf özelliğini kaybetti, bu da miras almayı bozarak modelin çalışmamasına neden oldu.
Hikaye
Projede yeni yöntemlerin otomatik üretilmesi için ekleme dekoratörü kullanıldı, ancak alt sınıfı döndürürken super() unutuldu. Sonuç olarak, hiyerarşi ve MRO bozuldu, bu da alt sınıflardaki temel sınıf çağrılarının çalışmamasına neden oldu.
Hikaye
Veri hattında birkaç dekoratör (kayıt, değişiklik izleyici) ile sınıfları sarmaya çalıştılar ama uygulama sırasının yanlış olması nedeniyle yöntem adları çakıştı, bu da üretimde "kaybolan" yöntemler nedeniyle hatalara yol açtı.