Python Hakkında Birkaç Soruya Cevap
Bir arkadaşımın Python hakkındaki birkaç sorusu üzerine, bu soruları blog'umdan cevaplamayı ve aynı soruların cevaplarını arayan diğer arkadaşlarla da paylaşmış olmayı istedim.
Sorulara ve cevaplara geçmeden önce, şunu belirtmek istiyorum, python öğrenmeye başlamış eski bir C veya Java geliştiricisiyseniz, bu geçmişiniz Python öğrenmeniz açısından talihsiz bir durum. Python öğrenmeden önce, C, Java, Php gibi diğer dilleri kullanmış geliştiriciler, bu dillerdeki alışkanlıklarını Python'a taşımaya meyillidir. Ancak, Python'un iş yapış şekli, kendine özgüdür. Bu yüzden, Python öğrenmeye başlarken, daha önce programlama ile öğrendiğiniz herşeyi gözardı etmeye çalışın, ve Python felsefesini öğrenmeye çalışın. Bu konuda anlaştıysak, soru-cevap bölümüne geçebiliriz.
Tkinter'de Frame.__init__
gibi bir ibare var. Buradaki mantık nedir?
Açıkcası ben Tkinter bilmiyorum, hiç kullanmadım, ama genel olarak iki alt tireli değişkenler ve sınıf metotlarından bahsetmek isterim. Python'la yeni tanışanlar için, iki alt tireli değişkenler ve metot isimlerinin kafa karıştırıcı olabileceğini, birkaç farklı şekilde gördüm. Eğer bunlar sizin de kafanızı karıştırıyorsa, bunlar hakkında benimsemeniz gereken ilk şey, bunların diğer sınıf metotlarından veya değişkenler bir farkı olmadığıdır.
2 Alt Tireli Değişkenlerin Özellikleri
Python'da ismi iki alt tireli değişkenlerin çoğu, Python tarafından tanımlanan değişkenlerdir, ancak isterseniz, siz de ismi __benimdegisken__ gibi bir değişken tanımlayabilirsiniz. Bu öntanımlı değişkenler, Python'un iç dinamikleri açısından önemlidir. İsimlerinin bu şekilde olmasının nedeni de budur. Böylece geliştiricilerin, farkında olmadan önemli değişkenlerin üzerine yazmasının önüne geçilmiş olur. Bu da demek oluyor ki, bu değişkenleri çalışma anında değiştirebilirsiniz. Ancak, yapmayın, kendi akıl sağlığınız için... Bunlardan sık kullanılan birkaçına örnek vermek istiyorum:
__name__: Bu değişken, bir modülün veya sınıfın çalışma anındaki adını tutar. Çalışma anında ilk çalıştırılan modülün adı "__main__" olur. Gerek doğrudan, gerekse dolaylı olarak içe aktarılan diğer modülüllerin adı ise, paket_adı.modül_adı gibi noktalı gösterim olur. Sınıfların adı ise, nasıl tanımladıysanız, o şekildedir.
__file__: Bu değişken, bir modülün dosya yolunu tutar.
|
"""
|
|
os_nerde.py
|
|
Bu modül, doğrudan çalıştırıldığında, ekrana os modülünün dosya yolunu
|
|
basar.
|
|
"""
|
|
import os
|
|
if __name__ == "__main__":
|
|
print(os.__file__)
|
__package__: Bu değişken, bir modülün hangi pakete ait olduğunun bilgisini tutar. Eğer modül hiçbir paketin içerisinde değilse, None döndürür.
|
"""
|
|
hangi_paket.py
|
|
"""
|
|
import os
|
|
from django.db import models
|
|
print(os.__package__)
|
|
# None
|
|
print(models.__package__)
|
|
# django.db.models
|
__doc__: Bu değişken, bir modülün belgelendirmesini döndürür. Modül içerisinde iki tırnak arasında (tek satırlık belgelendirme) veya 2 tane 3 tırnak arasında (çok satırlı belgelendirme) arasında kalan yazılar, o modülün belgelendirmesini oluşturur. __doc__değişkeni aynı zamanda, fonksiyonlar, sınıflar ve metotlar için de tanımlıdır.
Aklıma gelen özel değişkenler bunlar. Bunlardan başka var mıydı emin değilim.
Özel sınıf metotları
Aynı yukarıda bahsettiğimiz değişkenler gibi, Python için özel anlamı olan sınıf metotları, iki alt tireli olarak isimlendirilir. Bunlardan bazıları şunlardır:
__new__(): Bu metot, yeni bir sınıf örneği (eng:instance) oluşturulacağı zaman çağırılır. Görevi yeni bir sınıf örneği döndürmektir. Bu metoda python manyağı değilseniz hiçbir zaman ihtiyaç duymazsınız. Şahsen ben hiç kullanmadım. İngilizce bilenler, daha detaylı bilgi için: metaclass hakkındaki So sorusuna bakabilirler.
Ekleme: 5 Ekim 2013 Bununla ilgili ingilizce bir kaynağı çevirdim. Python metaclass örnekleri ile ilgili yazıyı okuabilirsiniz.
__call__(): Bu metot sınıfı çağırmak için kullanılır.
b = a()
gibi bir kodla, sınıfı çağırmış olursunuz. yani,
b = a()
python tarafından b = a.__call__()
şekline çevirilir. Eğer bu metodun üzerine yazmazsanız, bu metot,
__new__()
metoduyla yeni bir sınıf örneği oluşturur, daha
sonra bu örneği döndürür.
__init__(): __new__()
metodu tarafından, yeni bir
sınıf örneği oluşturulduktan hemen sonra çağırılır. Çok sık kullanılan
bir sınıf metodudur. Sınıf örneğinin kullanıma hazır olması için gereken
tüm işlemler __init__()
metodu içerisinde yapılır.
__getitem__() ve __setitem__():köşeli parantez gösterimiyle
anahtar alma ve anahtar ayarlama işlemlerinde çağırılır.
b = a[5]
gibi bir ifade kullandığınızda, Python bunu
b = a.__getitem__(5)
şeklinde çalıştırır.
__add__() ve __mul__():Bunlar, iki obje toplanırken veya
çarpılırken kullanılır. Örneğin a + b
yazdığınızda,
aslında çalışan şey a.__add__(b)
fonksiyon çağrısıdır.
__eq__(), __ne__(), __gt__(), __ge__(): Bunlar iki
obje karşılaştırılırken kullanılır. Çoğu zaman True
ya da
False
döndürürler. Örneğin, if a == b
python tarafından if a.__eq__(b)
şeklinde yorumlanır.
Sonuç olarak
Python'un en büyük zenginliklerinden birisi de, bize birçok konuda özgürlük sağlıyor olmasıdır. Burada bahsettiğim özel sınıf metotları, tüm sınıf metotlarının çok az bir kısmını içine alıyor. Eğer merak edip diğerlerine de bakmak isterseniz, Python'da veri modelleri ile ilgili belgedeki özel metot isimleri ile alakalı bölüme göz atabilirsiniz.
Python ile Java'daki gibi mouse listener, veya key listener nasıl yapılır?
Soruyu soran arkadaş, hangi uygulamada klavye ve mouse olaylarını takip etmek istediğini söylememiş, o yüzden birkaç farklı uygulamada bakalım.
Tkinter de fare ve klavye olaylarına geriçağırım fonksiyonu
Ben aslında Tkinter bilmiyorum, ama, biraz araştırdım ve Events and Bindings makalesini buldum. Bu makalede anlatılana göre, Tkinter objelerine bind metoduyla geriçağırım fonksiyonu eklenebiliyor. İlk argüman, olay türünü, ikinci argüman ise, çağırılacak fonksiyonu gösteriyor.
Bunun detaylarına yukarıda verdiğim linkden bakabilirsiniz.
PyQt Olayları
PyQt'de farklı olaylarla uğraşmanın birkaç farklı yolu. Bunlardan bir tanesi şöyle birşey:
Python'da raise
ne işe yarar
Python'da raise, bir hata yükseltmek için kullanılır. Daha sonra istenirse, bu hata try..except bloğuyla yakalanabilir.
Python'da map()
ve filter()
fonksiyonları ne işe yarar?
map()
map()
fonksiyonu, ilk argümanı olarak bir fonksiyon,
ikinci argümanı olarak sırayla elemanlarını alabileceği bir nesne alır.
Bu nesnenin her elemanını fonksiyona sokar ve sonucunu bir liste olarak
döndürür.
filter()
filter()
fonksiyonu, ilk argümanı olarak bir fonksiyon,
ikinci argümanı olarak sırayla elemanlarını alabileceği bir nesne alır.
Bu nesnenin her elemanını fonksiyona sokar ve fonksiyonun sonucunun True
olduğu elemanları bir liste olarak döndürür.
global
kelimesi ne işe yarar
Python'da fonksiyonlar gibi kod blokları içerisinde tanımlı olan
değişkenler, yerel değişken olur. Buralarda tanımlı olan değişkenler, bu
kod bloklarının dışında tanımlı değildir. Böyle kod bloklarının
içersinde tanımladığınız değişkenin tüm modül içerisinde kullanılabilir
olması için, global
kullanılır.