Python’da Decorator Mantığı ve Objeler

Berkin Öztürk
4 min readSep 20, 2021

Herkese Merhaba,

Bu yazımda bazıları için kafa karıştırıcı bir konu olan decorator’ların mantığını elimden geldiğince basit bir şekilde anlatmaya çalışacağım. Ama daha iyi anlamak için, gelin önce fonksiyon ve onları tutan objelere bir göz atalım.

Soldaki gibi bir fonksiyon tanımladığımız zaman Python kendine has etiketi olan bir fonksiyon objesi oluşturur. Yani çağrıldığında ‘Hello’ değerini döndüren ve ismi ve bazı özelliklere sahip bir obje hayal edebilirsiniz. Peki bu objeye nasıl ulaşacağız?

Soldaki gibi sırası ile fonksiyonları çalıştırırsak aynı sıra ile aşağıdaki output’ları elde ederiz.

say_hello() şeklinde run’ladığımız zaman bunun bir fonksiyon olduğu anlaşılır ve ‘Hello’ değerimiz döner. Ama __name__ özelliği say_hello olan fonksiyonun adını print edersek <function say_hello at 0x000002135AE8D160> output’unu elde ederiz. Objeye ulaştık, onun bir fonksiyon objesi olduğunu anladık ve adresini öğrendik. O zaman ben bu adresi istediğim başka bir değişkende de tutabilirim.

Peki say_hello2 = say_hello şeklinde bir değer atarsam ne olur?

Doğru, ikisi de print edildiği zaman output olarak aynı objeyi gösterir çünkü burada ‘say_hello’ bana tuttuğu fonksiyon objesinin adresini verdi ve python bunu ‘say_hello2’ye atadı. Eğer say_hello2 = say_hello() şeklinde bir değer atasaydım o zaman say_hello2 değerimin çıktısı ‘Hello’ olurdu çünkü fonksiyona bir değer atamış olurdum, obje adresine değil.

Şimdi bu öğrendiklerimiz ile yavaşça decorator mantığına doğru ilerleyelim.

Soldaki gibi bir kod yazdığım zaman say_hello_decorator fonksiyonu içine aldığı func’ı olduğu gibi döndürüyor sadece, say_hello fonksiyonu ise ‘Hello’ değerini döndürüyor.

Dikkatimizi lütfen say_hello = say_hello_decorator(say_hello) kısmına verelim. Bu blok çalıştığı zaman python bunu fonksiyon içerisindeki local değişken olan ‘func’ isimli başka bir değişkene say_hello ‘nun değeri olan fonksiyon objesinin adresini atıyor. Yani artık func = <function say_hello at 0x000002135AE8D160>. Sonrasında ise say_hello_decorator fonksiyonu çalıştığında bize func’ın içerisinde tuttuğu adresi dönüyor ve say_hello değişkenine yine aynı adresi atıyor. Çalıştırdığımız zaman ise say_hello fonksiyonu çalışmaya başlıyor ve ‘Hello’ output’unu elde ediyoruz.

Hah işte asıl kısma geldik, Python diyor ki sen her seferinde bunu yapmak yerine gel decorator’ları kullan.

Decorator Kullanımı

@say_hello_decorator olarak istediğim fonksiyonun üzerine yazabilirim ve bir parametre olarak yerini alır. Decorator’ların kullanımındaki amaç, daha okunabilir ve temiz kod yazmanız. Şimdi işi biraz karmaşıklaştıralım:

Burada say_hello_decorator’a say_hello’nun adresini verdik. Peki bize tekrar aynı adres mi gelecek yoksa artık bu başka bir fonksiyonun adresi mi?

print(say_hello) bloğu çalışınca karşımıza bu output geldi.

Gördüğünüz gibi farklı. Burada dikkat edilmesi gereken nokta func() ifadesi. Artık decorator’umuz eski adresi tutan func local değişkeni ile çalışmaya başladı. Wrapper fonksiyonu yolladığımız adresteki fonksiyon objesini çalıştırıyor ve ‘Hello’ yu return ediyor. Bundan sonra ben artık aşağıdaki gibi wrapper içerisinde fonksiyonuma istediğim şeyi yaptırabilirim ve parametre aldırtabilirim.

Output = Wrapper works & Hello Berkin Öztürk

Son bir kez gözden geçirmek gerekirse, ilk başta elimizde adı say_hello diyen bir fonksiyon ve return ettiği ‘Hello’ değeri vardı. Bu fonksiyona bir decorator ekleyerek (say_hello_decorator) say_hello = say_hello_decorator(say_hello) ifadesini tanımlamış olduk. Yani bir fonksiyonun içerisine fonksiyon adresi yolladık. Böylelikle say_hello_decorator fonksiyonunda ya adresini yolladığımız fonksiyonu hiçbir değişikliğe uğratmadan say_hello fonksiyonuna geri göndeririz ya da yeni özellikler ekleyip say_hello’nun ilk adresteki fonksiyonunu çalıştırırız. Ama bunun dışında yukarıdaki örnekteki gibi val = ifadesini kullanırsanız ilk adresteki fonksiyon çalışmadan da belli işlemler yapabilirsiniz.

Özetle; say_hello_decorator fonksiyonu, say_hello’nun tuttuğu adresi alıp ona wrapper’ın adresini veriyor ve al şunu çalıştır zaten öncesinde veya sonrasında bazı işlemlerin arasında ilk fonksiyon gerekli yerlerde çalışacak, dert etme diyor.

Bu yazı, hem kendime hem de decorator mantığını anlamak isteyen insanlara anladığım şeyleri anlatmak amacı ile yazıldı. İnternette araştırdığım kaynaklar ile kendi kelimelerimi birleştirdiğim bu yazının sizlere faydalı olması dileği ile…

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Berkin Öztürk
Berkin Öztürk

Written by Berkin Öztürk

If that shortcut was actually a shortcut, it would be called a route.

No responses yet

Write a response