Yaklasik 4 yil once Python ile birseyler yapmaya basladigimda bazi kavramlar kafami oldukca fazla karistirmisti. Bunun sebebi aslinda OOP temelli ciddi bir projeye o gune kadar ugrasmis oldugum Java ve C++ programlama dilleri ile imza atmamis olmamdi. Her ne kadar is goren ve problemi cozen isler yapiyor olsam da OOP altyapisindan genellikle uzak kaliyordum. Fakat Python ile giristigim isler beni OOP tarafina bir nevi mecbur kildi ve Python’daki bazi kavramlari daha detayli ogrenmeye kalkismistim. Aslinda OOP tarafinda ciddi bir temeli olan birileri icin Python’in getirdigi kavramlar cok farkli ya da yeni degil.
Bu bahsettigim kavramlarin basinda genellikle cogu sinifa ait metotlarin ilk parametresi olan self parametresi geliyor. Fakat bu kavramlari aciklamaya daha kolay anlasilacagindan ornek uzerinden devam etmek istiyorum. Bunun icin OOP orneklerinde siklikla kullanilan musteri sinifi uzerinden asagidaki kod ile durumu orneklemek istiyorum.
''' Created on 14 Jan 2017 @author: Ibrahim Ozturk @author: www.ozturkibrahim.com ''' class Musteri(object): """Bir banka musterisinin hesabindaki tutari kontrol etme. Musteri sinifi asagidaki ozelliklere sahiptir : Ozellikler: isim : Musteri ismini tutan string turunde parametre bakiye : Musterinin hesabinda halihazirdaki bakiyeyi gosteren float tipinde parametre. """ def __init__(self, isim, bakiye=0.0): """Girilen isim ile ve baslangic bakiyesi olarak sifiri koyan musteriyi olusturur.""" self.isim = isim self.bakiye = bakiye def paraCek(self, tutar): """Hesaptan ilgili tutarin cekilmesinin ardindan yeni bakiyeyi doner.""" if tutar > self.bakiye: raise RuntimeError('Bakiye yetersiz.') self.bakiye -= tutar self.bilgiGoster() return self.bakiye def paraYatir(self, tutar): """Hesaba ilgili tutarin yatirilmasinin ardindan yeni bakiyeyi doner..""" self.bakiye += tutar self.bilgiGoster() return self.bakiye def bilgiGoster(self): """Ilgili musterinin ismini ve hesap bakiyesini ekrana basar..""" print(self.isim + " isimli musteriye ait bakiye >> " + str(self.bakiye) + " TL'dir.") musteri1 = Musteri('Ibrahim Ozturk', 500.0) musteri1.paraCek(100.0)
Her ne kadar self Python acisindan ozel bir karsiligi olmasa da Python programcilari arasinda yazili olmayan yerlesik bir kural gibidir. Self sinif icerisinde metotlara, parametrelere ulasmak icin siklikla kullanilabilinir.
musteri1 = Musteri('Ibrahim Ozturk', 500.0)
Ornegin, bu satir ile Musteri sininifin gerceklenmis hali olan musteri1 nesnesi olusturulmus olmaktadir. Ilgili hesaptan para cekmek icin ise
musteri1.paraCek(100.0)
kullanilacaktir. Cekimin ardindan ekrana son bakiye sinif icerisindeki baska bir metodu cagirarak saglanmaktadir.
self.bilgiGoster()
Self paramatresi ile ise ilgili sinifa ait metotlari ya da parametreleri kullanacaginiza isaret edersiniz. Bu satir aslinda bir nevi Musteri.bilgiGoster() gibi birseydir.
Diger yandan self.isim ve self.bakiye ile de sinif icerisindeki global degiskenlere tum metotlar icerisinden erisim saglanmaktadir.
Ozetle bu kisa yazimizda self parametresine cok genel bir bakis ile orneklemeye ve kullanim yerlerinden birini gostermeye calistim. Eger sorulariniz olursa asagiya yorum olarak birakarak aktarabilirsiniz.
Keywords : python, programlama, self, nesne, sinif, self keyword, self sozcugu, kelimesi, oop programlama,
pip2 install PyChromecast
Kurma tamamlanmis olsa da import etmeye calistigimda hata aliyorum, module bagli alt paketlerden dolayi. Dolayisiyla kurulumun tam saglikli yapilamadigini farkediyorum. Okumalarimda bu durumu Python 2.7’de yasayan bircok kisi oldugunu goruyorum. Suradan ilgili konunun detaylarina erisebilirsiniz. Eger bu sorunu cozmeden cihaza baglanmaya kalkarsaniz ilgili paketler yuklu olmadigindan muhtemelen asagidaki hatayi alacaksinizdir.
AttributeError: 'Chromecast' object has no attribute 'status'
Onerilen cozum ise kullandigimiz pip versiyonu nu update etmek ki gercekten bunu yapip tekrar yuklemeye calistigimizda sorun kalmiyor import tarafinda da.
pip2 install --upgrade
Hemen USB uzerinden haberlestigim chromecast ile ilgili python modulu ile asagidaki kod ile haberlesmek istedim.Fakat malum sorunsuz ilerlemek cok zordur bu islerde. Ilgili kod normalde bagli olan cihazlarin isim listesini donmesi gerekirken -ki bir cihaz bagli- bos bir liste donuyordu. Yani bagli bir cihaz yok manasinda.
Sorunu pychromecast uzerinden arastirdigimda Windows senaryosunda pychromecast in bagli oldu zeroconf modulunun de bagli oldugu netifaces paketinin versiyon uyusmazligindan kaynaklandigini gordum. Bu durumu ayrintili okumak isterseniz suradan ve suradan bakabilirsiniz.
''' Created on 7 Jan 2017 @author: Ibrahim Ozturk @author: www.ozturkibrahim.com ''' from __future__ import print_function import time import pychromecast cast = pychromecast.get_chromecasts_as_dict().keys() print(cast) print("Program completed!")
Bunun cozumu icin de versiyon uyusmazligini cozme adina netifaces paketinin varolan versiyonunu kaldirip uyumlu versiyonunu yuklemeyi asagidaki gibi tamamladim.
pip2 uninstall netifaces pip2 install netifaces==0.10.4
Yukaridaki kodu degisiklik yapmadan tekrar denedigimde bu sefer chromecasti gordugunu ve cihaz adini gosterildigi gibi ekrana yansittigini gordum. 10-15 dakikalik zamanda ancak bu kadarlik bir paylasim yapabiliyorum. Umuyorum sonraki yazilarda API’nin icerisine girip uygulamalar yapmaya firsatim olur.
Asagidaki kod gerceklemesinin sorularinin ve islemlerinin anlatimininin Turkcesini https://www.youtube.com/watch?v=3-539wQLCaQ linkinden izleyip Python versiyonunu buradan inceleyebilirsiniz.
Kod:
import math # Questions are translated from https://www.youtube.com/watch?v=3-539wQLCaQ #Example 1 #A tire company producing tires during 5 days in a week. 4 of tires averagely #are failed in a weekly based production. What is the probability #of at least 3 failed tires production in a day in the company, def poisson_probability(actual, mean): # naive: math.exp(-mean) * mean**actual / factorial(actual) # iterative, to keep the components from getting too large or small: p = math.exp(-mean) for i in xrange(actual): p *= mean p /= i+1 return p def example1(): mean = 4./5 prob = poisson_probability(0,mean) + poisson_probability(1,mean) + poisson_probability(2,mean) prob = 1 - prob percent_str = '{:.2%}'.format(prob) print("EX1 : At least 4 damaged tyres pw so the probability of 3 damaged pw : %", percent_str) def example2(): mean = 3*2 #mean for 2 decares prob = poisson_probability(5,mean) percent_str = '{:.2%}'.format(prob) print("EX2(a) : The probability of drying out for 5 of them : %", percent_str) prob = poisson_probability(0,mean) + poisson_probability(1,mean) + poisson_probability(2,mean) percent_str = '{:.2%}'.format(prob) print("EX2(b) :The probability of drying out for max 2 of them : %", percent_str) if __name__ == '__main__': example1() example2() pass
Cikti :
(‘At least 4 damaged tyres pw so the probability of 3 damaged pw : %’, ‘4.74%’)
(‘The probability of drying out for 5 of them : %’, ‘16.06%’)
(‘The probability of drying out for max 2 of them : %’, ‘6.20%’)
–