Merhaba,
Class ları çok uzun bir süre öğrenmemek için aşırı derecede ısrarcı davrandım. Öğrenmeye karar verip yazdığım kodlara uyarlamaya başladığım zaman da beni esir aldı. Demek istediğim, doğru şekilde öğrenip iyice kavradığın zaman bırakamadığın bir method haline dönüşüyor.
Örnekler vererek anlatmamız gerekiyor.
Türkçedeki karşılığımız ne oluyor? Nesne Tabanlı Programlama. Yazdığımız kodları bir nesneye uyarlamak. Böylelikle oluşturulan nesneleri işlemek ve yönetmek konusunda acayip fayda sağlıyor.
Bu sistemi bir plan olarak düşün. Araba ile ilgili bir nesne oluşturmak için class method unu kullanarak bunu planlıyoruz. Böylelikle oluşturduğumuz araba nesnesinin özelliklerine tek bir yerden erişebiliyor ve kullanabiliyoruz. Farkı görelim.
araba_rengi = "Siyah"
araba_hp = 136
araba_kg = 1200
araba_tip = "Cabrio"
class Araba():
renk= "Siyah"
hp = 136
kg = 1200
tip = "Cabrio"
Fark eden ne oldu? İlk yazdığımız şekilde program 4 farklı değişken odluğunu biliyor. İkinci yazdığımız da ise program 4 farklı değişkenin bir bütün olduğunu ve bu bütünün bir nesneyi oluşturduğunu biliyor.
Programın farklı bir alanında Car
nesnesinin rengini, tipini vb özelliklerini çekmek istediğiniz zaman Araba.renk
diyerek o özelliğe erişebilir, alabilir, değiştirebilirsiniz. Bu temel verilebilecek en basit örnek diyelim. İhtiyaçlarınız doğrultusunda Class lar size daima cevap verir.
Biraz daha kapsamlı bakalım olaya ve şimdilik size karışık gibi görünecek şeyler ekleyelim.
import sqlite3
class Uygulama(object):
def __init__(self):
self.database()
self.main()
def database(self):
self.baglanti = sqlite3.connect("database/db_1.db")
self.imlec = self.baglanti.cursor()
self.imlec.execute("CREATE TABLE IF NOT EXISTS KULLANICI_BILGILERI (KULLANICI_ADI TEXT, SIFRE TEXT,"
"KAYIT_TARIHI TEXT, SON_GIRIS TEXT)")
self.baglanti.commit()
self.baglanti.close()
def main(self):
self.ekran_1 = Tk()
self.ekran_1.geometry(self.ekran_1_boyutlari)
self.ekran_1.title(self.ekran_1_etiket)
self.ekran_1.resizable(FALSE, FALSE)
self.giris_butonu = Button(self.ekran_1, text="GİRİŞ", width=10, command=self.giris_ekrani)
self.giris_butonu.pack(side=TOP, pady=25)
self.kayit_butonu = Button(self.ekran_1, text="KAYIT", width=10, command=self.kayit_ekrani)
self.kayit_butonu.pack(side=TOP)
self.cikis_butonu = Button(self.ekran_1, text="ÇIKIŞ", width=10, command=self.cikis_program)
self.cikis_butonu.pack(side=TOP, pady=25)
self.durum_1 = False
mainloop()
Şimdi bunun mealini yapalım.
Uygulama adında bir sınıf oluşturduk. Bu sınıfın obje türünden olduğunu belirttik. Yani nesne. Bir bütün olduğunu söylüyor.
Ardından def _init__(self):
şeklinde bir fonksiyon yazılmış. Bu şu anlama geliyor; Uygulama adındaki nesne işleve geçtiği zaman çalışacak ilk kod blokları, fonksiyonlar, tanımlamalar vb şeyler def _init__(self):
altında yer alacak. Yani def _init__(self):
ilk çalışacak kodları barındırır. Ki bunu epey zaman önce anlamayarak çok doğal bir şekilde bende sormuştum bkz: Python - Nedır bu __init__():?
Peki neden program ilk çalıştırılacak kodları ayrıca tutmak için bir fonksiyona ihtiyaç duysun ki? Çünkü Class lar düz kod yazmak gibi değildir. Düz kod yazdığın zaman baştan sonra doğru program sırasıyla tek tek çalıştırır. Ama Class larda bu iş yukarıda belirttiğim gibi çağırıldığı zaman, ihtiyaç duyulduğu zaman işleve girer.
Gördüğün gibi iki tane fonksyion oluşturulmuş. Birisi database
diğeri main
. Nesne hangisinde işlem yapmak istiyorsa ona ulaşabiliyor.
from tkinter import *
from tkinter import messagebox
import sqlite3
from datetime import datetime
class Uygulama(object):
def __init__(self):
self.baglanti = None # sqlite3 dosya değişkeni
self.imlec = None # sqlite3 için imleç
self.kayitli_kullanici = None # database için kayıtlı kullanıcı listesi
self.maksimum_kullanici = 10 # database maksimum kayıt olacak kişi sayısı
self.ekran_1 = None # ana pencere
self.ekran_1_etiket = "GİRİŞ VE KAYIT OL PANELİ" # ana pencere etikeit
self.ekran_1_boyutlari = "325x400+100+100" # ana encere boyut ve konumu
self.giris_butonu = None # giriş ekranı açmamız için gereken button değişkeni
self.kayit_butonu = None # kayıt ekranı açmamız için gereken button değişkeni
self.cikis_butonu = None # çıkış yapabilmemiz için gereken button değişkeni
self.durum_1 = False # ekran durumu açık mı kapalı mı
self.giris_cercevesi = None # giriş ekranı çerçevesi
self.kayit_cercevesi = None # kayıt ekranı çerçevesi
self.kullanici_yazisi = None # giriş ve kayıt ekranı için kullanıcı adı etiket alanı değişkeni
self.sifre_yazisi = None # giriş ve kayıt ekranı için şifre etiket alanı değişkeni
self.kullanici_girdi = None # giriş ve kayıt ekranı için kullanıcı adı yazzma alanı değişkeni
self.sifre_girdi = None # giriş ve kayıt ekranı için şifre yazma alanı değişkeni
self.cerceve_temizleme = None # çerçevelerimizi temizlemeye ihtiyacımız olan buton değişkeni
self.cerceve_cikis = None # çerçevelerimizden çıkış yapmaya ihtiyacımız olan buton değişkeni
self.cerceve_onay = None # çerçevelerimizdeki ilemleri onaylamamıza ihtiyacımız olan buton değişkeni
self.giris_bilgisi = None # giriş bilgisi
self.kayit_bilgisi = None # kayit bilgisi
self.database()
self.main() # ana fonksiyon
def database(self):
self.baglanti = sqlite3.connect("database/db_1.db")
self.imlec = self.baglanti.cursor()
self.imlec.execute("CREATE TABLE IF NOT EXISTS KULLANICI_BILGILERI (KULLANICI_ADI TEXT, SIFRE TEXT,"
"KAYIT_TARIHI TEXT, SON_GIRIS TEXT)")
self.baglanti.commit()
self.baglanti.close()
def main(self):
self.ekran_1 = Tk()
self.ekran_1.geometry(self.ekran_1_boyutlari)
self.ekran_1.title(self.ekran_1_etiket)
self.ekran_1.resizable(FALSE, FALSE)
self.giris_butonu = Button(self.ekran_1, text="GİRİŞ", width=10, command=self.giris_ekrani)
self.giris_butonu.pack(side=TOP, pady=25)
self.kayit_butonu = Button(self.ekran_1, text="KAYIT", width=10, command=self.kayit_ekrani)
self.kayit_butonu.pack(side=TOP)
self.cikis_butonu = Button(self.ekran_1, text="ÇIKIŞ", width=10, command=self.cikis_program)
self.cikis_butonu.pack(side=TOP, pady=25)
self.durum_1 = False
mainloop()
def giris_ekrani(self):
if not self.durum_1:
self.giris_cercevesi = Frame(self.ekran_1, bd=5, relief=RAISED)
self.giris_cercevesi.pack(pady=10)
self.giris_bilgisi = Label(self.giris_cercevesi, text="GİRİŞ EKRANI", width=42)
self.giris_bilgisi.grid(row=1, column=1, columnspan=2)
self.kullanici_yazisi = Label(self.giris_cercevesi, text="KULLANICI ADI >>", width=20)
self.kullanici_yazisi.grid(row=2, column=1)
self.sifre_yazisi = Label(self.giris_cercevesi, text="ŞİFRE >>", width=20)
self.sifre_yazisi.grid(row=3, column=1)
self.kullanici_girdi = Entry(self.giris_cercevesi, width=20)
self.kullanici_girdi.grid(row=2, column=2)
self.sifre_girdi = Entry(self.giris_cercevesi, width=20, show="*")
self.sifre_girdi.grid(row=3, column=2)
self.cerceve_onay = Button(self.giris_cercevesi, text="ONAY", width=20, bd=2, relief=RAISED,
command=self.giris_onay)
self.cerceve_onay.grid(row=4, column=1, pady=10)
self.cerceve_temizleme = Button(self.giris_cercevesi, text="TEMİZLE", width=20, bd=2, relief=RAISED,
command=self.cerceve_temizlemex)
self.cerceve_temizleme.grid(row=4, column=2)
self.cerceve_cikis = Button(self.giris_cercevesi, text="ÇIKIŞ", width=42, bd=2, relief=RAISED,
command=self.cikis_cerceve_1)
self.cerceve_cikis.grid(row=5, column=1, columnspan=2, pady=10)
self.durum_1 = True
def kayit_ekrani(self):
if not self.durum_1:
self.kayit_cercevesi = Frame(self.ekran_1, bd=5, relief=RAISED)
self.kayit_cercevesi.pack(pady=10)
self.kayit_bilgisi = Label(self.kayit_cercevesi, text="KAYIT EKRANI", width=42)
self.kayit_bilgisi.grid(row=1, column=1, columnspan=2)
self.kullanici_yazisi = Label(self.kayit_cercevesi, text="KULLANICI ADI >>", width=20)
self.kullanici_yazisi.grid(row=2, column=1)
self.sifre_yazisi = Label(self.kayit_cercevesi, text="ŞİFRE >>", width=20)
self.sifre_yazisi.grid(row=3, column=1)
self.kullanici_girdi = Entry(self.kayit_cercevesi, width=20)
self.kullanici_girdi.grid(row=2, column=2)
self.sifre_girdi = Entry(self.kayit_cercevesi, width=20, show="*")
self.sifre_girdi.grid(row=3, column=2)
self.cerceve_onay = Button(self.kayit_cercevesi, text="ONAY", width=20, bd=2, relief=RAISED,
command=self.kayit_onay)
self.cerceve_onay.grid(row=4, column=1, pady=10)
self.cerceve_temizleme = Button(self.kayit_cercevesi, text="TEMİZLE", width=20, bd=2, relief=RAISED,
command=self.cerceve_temizlemex)
self.cerceve_temizleme.grid(row=4, column=2)
self.cerceve_cikis = Button(self.kayit_cercevesi, text="ÇIKIŞ", width=42, bd=2, relief=RAISED,
command=self.cikis_cerceve_2)
self.cerceve_cikis.grid(row=5, column=1, columnspan=2, pady=10)
self.durum_1 = True
def cikis_program(self):
if not self.durum_1:
self.ekran_1.quit()
self.durum_1 = False
def cikis_cerceve_1(self):
if self.durum_1:
self.giris_cercevesi.destroy()
self.durum_1 = False
def cikis_cerceve_2(self):
if self.durum_1:
self.kayit_cercevesi.destroy()
self.durum_1 = False
def cerceve_temizlemex(self):
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
def giris_onay(self):
if 4 < len(self.kullanici_girdi.get()) < 16 and 6 < len(self.sifre_girdi.get()) < 16:
self.baglanti = sqlite3.connect("database/db_1.db")
self.imlec = self.baglanti.cursor()
self.imlec.execute("SELECT * FROM KULLANICI_BILGILERI WHERE KULLANICI_ADI = ? AND SIFRE = ?",
(self.kullanici_girdi.get(), self.sifre_girdi.get()))
self.kayitli_kullanici = self.imlec.fetchall()
if len(self.kayitli_kullanici) == 0:
messagebox.showerror("GEÇERSİZ VERİ", "BÖYLE BİR KULLANICI YOK")
else:
self.baglanti.close()
messagebox.showinfo("BAŞARILI", "KULLANICI ADI VE ŞİFRESİ DOĞRU")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
self.cikis_cerceve_1()
self.giris_bilgisi = Label(self.ekran_1, text="SATEM SOFT GURURLA SUNAR")
self.giris_bilgisi.pack()
else:
messagebox.showerror("GEÇERSİZ VERİ", "KULLANICI ADINIZ VE ŞİFRENİZ EN AZ 5 EN ÇOK 15 KARAKTERDEN OLUŞMALIDIR.")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
def kayit_onay(self):
if 4 < len(self.kullanici_girdi.get()) < 16 and 6 < len(self.sifre_girdi.get()) < 16:
self.baglanti = sqlite3.connect("database/db_1.db")
self.imlec = self.baglanti.cursor()
self.imlec.execute("SELECT KULLANICI_ADI,SIFRE FROM KULLANICI_BILGILERI")
self.kayitli_kullanici = self.imlec.fetchall()
if len(self.kayitli_kullanici) == self.maksimum_kullanici:
messagebox.showerror("GEÇERSİZ VERİ", "MEVCUT KULLANICI! LÜTFEN GİRİŞ YAPINIZ!")
self.baglanti.close()
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
else:
self.imlec.execute("SELECT * FROM KULLANICI_BILGILERI WHERE KULLANICI_ADI = ? AND SIFRE = ?",
(self.kullanici_girdi.get(), self.sifre_girdi.get()))
self.kayitli_kullanici = self.imlec.fetchall()
if len(self.kayitli_kullanici) == 0:
self.imlec.execute("INSERT INTO KULLANICI_BILGILERI VALUES (?,?,?,?)", (self.kullanici_girdi.get(),
self.sifre_girdi.get(),
datetime.now(), datetime.now()))
self.baglanti.commit()
self.baglanti.close()
messagebox.showinfo("KAYIT BASARILI", "KAYIT BAŞARIYLA TAMAMLANDI")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
self.kayit_cercevesi.destroy()
self.durum_1 = False
else:
messagebox.showerror("GEÇERSİZ VERİ", "MEVCUT KULLANICI ADI!")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
else:
messagebox.showerror("GEÇERSİZ VERİ", "KULLANICI ADINIZ VE ŞİFRENİZ EN AZ 5 EN ÇOK 15 KARAKTERDEN OLUŞMALIDIR.")
self.kullanici_girdi.delete(0, END)
self.sifre_girdi.delete(0, END)
app = Uygulama()
Anlattıklarıma bakarak bu kodu biraz incele. Hatta gerekli kütüphaneleri yükleyerek kodu çalıştır. Bazı yerlerini bozup dene. Ne olacak acaba şu self’i silsem, object’i silsem init içinden şu fonksiyonu çıkarsam şunu ilk çalıştırsam diye karma karışık oyna.
Bir şeyi bir bütün haline getirmenin en doğru yolu parçalardır. Örneğin yapboz. Bozulmuştur ve paramparçadır. Sonra bir araya getiririz.
Biraz daha bakalım şu konuya;
Daha önce açtığım ve içerisinde güzel bilgiler olan bir konu >> Beyin Fırtınası - Nesne Tabanlı Programlama Bize Neler Katar? bunu incelemelisin. Yorumlar çok faydalı.
Ayrıca kapsamlı ve bir o kadar basit dil kullanılmış bir yazı daha var >> Python’da Class (Sınıf) ve Object (Nesne) Yapısı | by Alper Güven | Medium
Sınıflar ile ilgili verilen şu örnek çok güzel;
Kalem. Çeşit çeşit kalem vardır. Tükenmez, kurşun, uçlu, keçeli, pilot, dolma vb. İşte sınıflar bize kalemler adında bir nesne oluşturup bu kalem nesnesinin altında bir sürü alt türlerini işlemeye olanak sağlar.
Gereken ilk adım, temel mevzuyu öğren. ikinci adım, öğrendiklerin ile yapılabilecek şeyleri hayal et. Son adım, hayal ettiğin şeyleri üretmek için öğrendiklerini kullan.
Bu yazdıklarımın ne kadarını okudun bilmiyorum ama eğer bu cümleyi de okuyorsan tavsiyem şudur. Okumaya ayırdığın vakiti önce öğrenmeye ayır. Öğrendikten sonra okumaya başla, okuduktan sonra uygulamaya başla. Öğrenip, okuyup, uygulamayı bir arada yaparsan asıl öğrenmenin tam verimini alırsın.
Bilmediğin şeyi okuyamaz, okuyamadığını uygulayamaz, uygulayamadığını öğrenemezsin.