Python super() Methodu ve Django'da Kullanımı

Merhaba arkadaşlar,
Uzun zamandır yazmadığım bloguma yeni bir yazı ekleyeyim istedim iş yoğunluğundan fırsat bulunca.Bu yazı da hemen her dilde kullanılan super() fonksiyonundan bahsedicem.Ve bu fonksiyonun Python ve Django'da kullanım şekliyle ilgili birkaç basit kod satırı yazmayı planlıyorum.Yazıyı okumadan önce Object Oriented yapısına hakim olmak gerektiğini belirtmeden geçmeyeyim.Eğer hakim değilseniz tutorialspointte ki bu yazıyı inceleyebilirsiniz: https://www.tutorialspoint.com/python/python_classes_objects.htm

super() Fonksiyonu Ne İş Yapar?

Bu fonksiyon, bir class'a inheritance olarak verdiğimiz başka bir class'ta ki fonksiyonu override etmek isteyip aynı zaman da fonksiyonun kendisinden de vazgeçemediğimiz zamanlarda yardımımıza koşuyor.Yani şöyle ki; eliniz de bir class var, fonksiyonlarından birisini override etmek istediniz fakat sadece birkaç şeyi değiştirip fonksiyonun kendisini tekrar çalıştırmak istediniz.super() bu konuda yardımınıza koşuyor ve Django'da da çok sık kullandığım için üzerine bir blog yazmak istedim.Basit bir örnek ile şu şekilde açıklayabilirim;

class Foo(object):
    def __init__(self):
        print "worked Foo Class"
    def bar(self):
        print "worked foo bar function"

class Dummy(Foo): def bar(self): print "worked dummy bar" super(Dummy, self).bar()

dummy_class = Dummy() dummy_class.bar()

Çıktısı ise şu şekilde;
worked Foo Class
worked dummy bar
worked foo bar function

Bu basit kod blogunu çalıştırdığınız da yapacağı işlemleri adım adım anlatayım.Dummy Class'ına Foo Class'ını inheritance olarak verdik ve bar() fonksiyonunu override ettik.Burada önce Foo'nun __init__() fonksiyonu çalışacak object oriented kuralları gereği ve sonra Dummy'nin içinde ki bar() fonksiyonu.Bu fonksiyon da çalıştıktan sonra tekrar miras aldığı Foo class'ının bar() fonksiyonunu çalıştırıyor super() fonksiyonu sayesinde.

Django Rest Framework'te ki Yaygın Kullanımı

Django Rest API yazarken serializer katmanında çok sık kullandığım için böyle bir örnekte vermek istedim.En basit haliyle bir ModelSerializer Class'ında ki create() fonksiyonu üzerin de kullanımı için basit bir örnek kod paylaşayım.

from rest_framework import serializers

class FooSerializer(serializers.ModelSerializer):
    created_by = serializers.ReadOnlyField(read_only=True)

    class Meta:
        model = Foo
        exclude = ()

    def create(self, validated_data):
        validated_data['created_by'] = "ahmetkotan"

        super(FooSerializer, self).create(validated_data)

Burada da ModelSerializer'ın için de bulunan create() fonksiyonunu override ettik basit bir örnekle.Yaptığı işlem ise kısaca; create() methodu çalıştığı zaman gelen değerlerin içinden created_by field'ının değerini "ahmetkotan" olarak değiştirip çalışması gereken create() methodunu tekrar çalıştırıyor.Klasik tabirle araya girme işlemi de denilebilir.

Umarım faydalı olmuştur, iyi çalışmalar..


Tags: python, linux, django, super, object oriented