02-06-2017, Saat: 10:21
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
Kod:
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
Kod:
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
Kod:
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.
Kod:
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;
Kod:
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
Kod:
bar()
fonksiyonunu override ettik.Burada önce Foo'nun
Kod:
__init__()
fonksiyonu çalışacak object oriented kuralları gereği ve sonra Dummy'nin içinde ki
Kod:
bar()
fonksiyonu.Bu fonksiyon da çalıştıktan sonra tekrar miras aldığı Foo class'ının
Kod:
bar()
fonksiyonunu çalıştırıyor
Kod:
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
Kod:
create()
fonksiyonu üzerin de kullanımı için basit bir örnek kod paylaşayım.
Kod:
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
Kod:
create()
fonksiyonunu override ettik basit bir örnekle.Yaptığı işlem ise kısaca;
Kod:
create()
methodu çalıştığı zaman gelen değerlerin içinden
Kod:
created_by
field'ının değerini "ahmetkotan" olarak değiştirip çalışması gereken
Kod:
create()
methodunu tekrar çalıştırıyor.Klasik tabirle araya girme işlemi de denilebilir.
Umarım faydalı olmuştur, iyi çalışmalar..