Decorator ve Mixins

Bu iki kavram hakkında kafamda yerine oturmayan taşlar var. Decorator dediğimiz, yaptığım araştırmalardan (farklı kaynaklara ek olarak bu konuyu da okudum), denemelerden ve debug’lardan (Thonny IDE’sinde detaylı debug yaptım) anladığım kadarıyla, argüman olarak fonksiyon alan ve değer olarak da fonksiyon döndüren, fonksiyonların işlevini genişleten özel fonksiyonlar. Teoride anlamış görünüyorum ama pratikte bunu kullanmaya, yazılmış kodları anlamaya ve nerede, ne zaman kullanacağımı düşünmeye gelince çuvallıyorum. Özellikle Django’daki Mixins’ler konusunda da karanlıkta kalan noktalar var.

Bu iki konuyu Bilal’e anlatır gibi anlatabilecek olan var mı? Çok makbule geçer. Teşekkürler şimdiden. Mümkün olduğunca sade, mümkünse de görsel olarak, analojilerle ve uygulamalı bir şekilde anlatabilirseniz sevinirim.

bir classımız olsun ve bu class da bazı fonksiyonlara binding yapmamız gerek dışardan şöyle yapabiliriz

class KeyBind:
   binds = dict()
   @classmethod
   def bind(cls, key):
        assert isinstance(key, str)
        def setfunc(func):
             cls.binds[key] = func

        return setfunc
        
   def update(self):
        pass  # tuş basılmış mı falan diye kontrol edersin
@KeyBind.bind("A")
def pressed_A():
     print("pressed A")

örneğim umarım bir şeyleri açıklığa kavuşturmuştur aklınızda
ayrıca değer olarak fonksiyon döndürmesine gerek yok tabi fonksiyon içinde wrapper yazmadıysan

Django’daki mixin’ler nedir, dekoratorlerle baglantilari nedir veya ne oldugundan supheleniyorsun anlatirsan super olur. Mumkunse deneyimli programcilara anlatan bir kaynaga referans verirsen super makbule gecer.

Yazilmis kodlari anlamak: Anlayamadigin kodlara ornek gostermen lazim.
Nerede/ne zaman kullanilacagi: Baskalarinin nerede ve ne zaman kullandiklarini inceleyebilirsin. Tabi bunun icin yazilmis kodlari anlaman lazim. Ayrica dekoratorleri ortaya koyan PEP’te buna mutlaka deginiliyordur.
Pratikte kullanmak: Ihtiyacin oldugunda, kullanmak istediginde kullanabilirsin. Ihtiyacin olmadiginda kullanmana gerek yok.

1 Beğeni

Django mixin’leri başlığa yazmamın sebebi dekoratörlerle ilgisi olduğunu düşünmem değil, sadece bu iki kavram iş yerimde çok karşıma çıkıyor ve bu iki konuda eksiklerim var, o yüzden. :slight_smile:

Mixin’lerden ne anladığıma gelirsek, mixin’ler anladığım kadarıyla çoklu kalıtımla birden çok sınıfta kullanılabilen ve o sınıfların işlevini/kapsamını genişletebilen yapılar. En çok aşina olduğum örnek LoginRequiredMixin. Kaynak olarak da bu yazdığım kaynaktan bir şeyler anlamaya çalıştım ama çok sofistike geldi.

Dekoratörler konusunda yazdıklarınıza gelirsem:

Yazılmış kodları anlamaktan kastım, yine, iş yerimdeki modüllerde kullanan dekoratörler. Onları takdir edersiniz ki yazamam. İnternet üzerinden baktığım, denk geldiğim dekoratörler genelde basit, onları anlamakta problemim yok. Ama iş yerimdeki gibi çoklu dekoratörlü, üstelük argüman bulunan dekoratörlerde neyin ne olduğu birbirine giriyor.

Pratikte kullanmakta problemimden kasıt da ne zaman ihtiyaç duyacağımı ayırt edememem aslında. Şimdiye kadar hep dekoratörsüz kod yazdığım için, aşina olmadığım bir kavram/konsept olduğundan, iş yerimdeki ya da internetteki (henüz internette çoklu, üstelik argüman alan dekoratörlere çok bakmasam da) ileri düzeydeki dekoratörleri nasıl kullanabileceğimi, modifiye edebileceğimi bilememem. Bu konuda kendimi geliştirmem şart çünkü iş yerimde çoğu modülde kullanılıyor ve işim gereği bunları kavramak ve gerektiğinde bizzat katkıda bulunmak zorundayım.

Teşekkürler ilginiz, vaktiniz ve yardımlarınız için. :slight_smile:

Is yerinizin ne oldugunu bilmiyorum, profilinizde de yazmiyor.

Basit ile karmasik dekoratorlerin calisma prensibi acisindan bir farki olmadigini goz onunde bulundurursak, acaba sorun genel olarak kod okumayla mi ilgili? Is arkadaslarinizdan kodu veya dokumentasyonunu daha acik hale getirmelerini rica edebilirsiniz.

Bu arada dekoratorlerin butun olayi o—kodu daha okunur hale getirmek. Fonksiyonlarin ortak huylarini belirtmek.

Parametre alanlar farkli, cunku almayanlar @dek() yerine @dek seklinde yaziliyor ve yine de cagriliyorlar. Fonksiyon donduren fonksiyon donduren fonksiyonun kafa karistirici olduguna katiliyorum, fakat distaki fonksiyonun dekorator argumanlarini tutup wrapper’i dondurmek disinda hic bir gorevi yok (olmamali):

def multiply_calls(n):
	# vvvvv #
	def wrapper(f):
		@functools.wraps(f)
		def wrapped(*args, **kwargs):
			[f(*args, **kwargs) for _ in range(n)]
		return wrapped
	# ^^^^^ #
	return wrapper
1 Beğeni

Çok teşekkürler. :slight_smile: