ProgramlamaBackend geliştirici

Python'da sınıf dekoratörleri nedir? Onları kullanarak sınıfların işlevselliğini nasıl değiştirebilir veya ekleyebilirsiniz? Bir örnek verin ve olası nüansları anlatın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

En basit sınıf dekoratörü örneği:

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.

Nüanslar:

  • Sınıf dekoratörleri sadece sınıfa iç içe eklemeler döndürmekle kalmaz, aynı zamanda tamamen sarılmış (örneğin, proxy sınıflar veya kalıtcılar) döndürebilir.
  • Dekoratör, sınıf örnekleri oluşturulurken kullanılan *args ve **kwargs argümanlarını desteklemiyorsa, hatalar alabilirsiniz.

Kandırmaca soru.

İki sınıf dekoratörünü üst üste uygularsak ne olur? Uygulama sırası her zaman belirgin midir?

Cevap:

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))

Bilgi eksikliği nedeniyle gerçek hata örnekleri.


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ı.