Here is the English version.
Nesne yönelimli kod yazarken sınıf özelliklerine (değişkenlerine) sıklıkla verilen argüman değerlerini atarız. Her bir argüman için bu işi yapmak büyük satır kalabalığı demektir. Bakalım:
class Test: def __init__(self, x, y, z, t): self.x = x self.y = y self.z = z self.t = t print self.x,self.y,self.z,self.t
Buradaki tekrar eden benzer satırları yok etmek için bir decorator çözümü geliştirdim:
def injectArguments(inFunction): def outFunction(*args,**kwargs): _self = args[0] _self.__dict__.update(kwargs) inFunction(*args,**kwargs) return outFunction class Test: @injectArguments def __init__(self, x, y, z, t): print self.x,self.y,self.z,self.t @injectArguments def fonksiyon(self, ad): print "Ad:",self.ad t = Test(x=4, y=5, z=6, t=7) t.fonksiyon(ad="Emre")
args, argümanları içeren bir sözlük iken kwargs anahtar kelimeli argümanları içeren bir sözlük. arg[0] self’e karşılık geliyor. Yapacağımız şey self.__dict__’i yani t nesnesinin değişkenlerin değerlerini tutan bu sözlüğü verilen anahtar kelimeli argümanlarla ( {‘x’:4, ‘y’:5,’z':6,’t':7} ) genişletmek/güncellemek olacak. Bu sayede self.x = x vb. kodlardan kurtulmuş olacağız.
Python’un kütüphanelerinde bunun için hazır bir çözüm var mı (varsa söyleyin lütfen) bilmiyorum ama bu kodu bir hayli kullanacağım gibi. ActiveState Recipies sitesine koyduğum bu koda yeni bir yorum geldi, keyword kullanmadan (ad=”Emre” yerine “Emre” diyerek) bu iş yapılabiliyormuş. Nasıl mı? fonksiyonadi.func_code.co_varnames dediğinizde o fonksiyonun parametrelerinin adlarını öğrenebiliyormuşsunuz. Çok önemli bir bilgi.
18.30 on Eylül 5th, 2010
Bu kadar işlevsel bir decorator hayal etmemiştim
ellerine sağlık..
18.39 on Eylül 5th, 2010
Hehehe
Bilmiyorum nasıl oldu da geldi aklıma ama keşke buna bir çözüm olsa diye düşünüp duruyordum uzun zamandır. Sen decorator belgesini gönderince (daha önce decoratorları duymuş olmama rağmen) dank etti birden =) Recipies’e da gönderdim şurada.