Class'ın Mantığını Anlamak

Class sınıfı hakkında biraz kafam karıştı.
Class sınıfını biraz anlatabilir misiniz? Nerede kullanılabileceğimizi vs.

Self, init gibi kavramları da hâlâ ne amaç ile kullandığımızı anlayamadım.

class sınıfı diye bir şey yok. class keyword’ünü kastediyorsunuz sanırım.
Sınıf nedir ?
Sınıflar ne işe yarar ?

4 Beğeni
class person():
    def __init__(self,name,surname,birtday_year,unvan):
        self.name = name
        self.surname = surname
        self.birtday_year = birtday_year
        self.unvan = unvan
class teacher(person):
    def __init__(self, name, surname, birtday_year, unvan, salary):
        super().__init__(name, surname, birtday_year, unvan)
        self.salary = salary
    def display_salary(self):
        print(f"{self.name} isimli öğretmenin maaşı {self.salary} ₺'dir.")
    def tax(self):
        self.taxi = (self.salary / 350) * 60
        print('Vergi miktarı: ',self.taxi)
    def newSalary(self):
        self.tax()
        self.salary = (self.salary - self.taxi)
        print('Yeni maaş:',self.salary)
    def teacherInfo(self):
        print("{} {} isimli öğretmen, {} ünvanına sahiptir ve {} ₺ maaş almaktadır.".format(self.name,self.surname,self.unvan,self.salary))

r1 = teacher('Muhammed Ali Fatih','Erbakan',1979,'Doktor',6100)
r1.newSalary()
r1.teacherInfo()

mantığını anlamak için şöyle tuhaf bişey yaptım. Olmuş mu bu yav? :smiley:

Bir de:

    def age(self):
        self.aget = datetime.datetime.now().year - self.birtday_year

yaş fonksiyonu tanımlamak istiyorum ancak başka bir fonksiyon içerisinde bu yaşı çekemedim.

1 Beğeni

Hatayı paylaşırmısınız ?
Bu işe yarıyor:

import datetime
class person():
    def __init__(self,name,surname,birtday_year,unvan):
        self.name = name
        self.surname = surname
        self.birtday_year = birtday_year
        self.unvan = unvan
class teacher(person):
    def __init__(self, name, surname, birtday_year, unvan, salary):
        super().__init__(name, surname, birtday_year, unvan)
        self.salary = salary
    def display_salary(self):
        print(f"{self.name} isimli öğretmenin maaşı {self.salary} ₺'dir.")
    def tax(self):
        self.taxi = (self.salary / 350) * 60
        print('Vergi miktarı: ',self.taxi)
    def age(self):
    	self.aget = datetime.datetime.now().year - self.birtday_year
    	print(f"Öğretmen {self.aget} yaşında")
    def newSalary(self):
        self.tax()
        self.salary = (self.salary - self.taxi)
        print('Yeni maaş:',self.salary)
    def teacherInfo(self):
        print("{} {} isimli öğretmen, {} ünvanına sahiptir ve {} ₺ maaş almaktadır.".format(self.name,self.surname,self.unvan,self.salary))

r1 = teacher('Muhammed Ali Fatih','Erbakan',1979,'Doktor',6100)
r1.newSalary()
r1.teacherInfo()

print("-------------------------------")
r1.age()
1 Beğeni

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.

4 Beğeni

Gerek burada

gerek de paylaştığınız bu linkte https://medium.com/@alperguven1903/pythonda-class-sınıf-ve-object-nesne-yapısı-c1deb10c4edc __init__ için

Yani bir sınıf içerisinde ilk çalışan method olur kendileri.

deniyor; peki ilk o metot çalışıyorsa, self nereden geliyor? Dolayısıyla aslında ilk orası çalışmıyor olsa gerek.

1 Beğeni

Hatadan kastım şu ki;
Herşeyin bir standardı var. Yani yanlış bir kullanım veya şöyle yapsan daha iyi olurdu diyebileceğiniz bir alandan bahsetmiştim.

1 Beğeni

Kaynaklar ve yardımlarınız için çok teşekkür ederim.

otomobillerr = {
    1:{
        'marka':'Opel',
        'model':'Astra',
        'üretim': 2015,
        'renk': 'Siyah'
    },
    2:{
        'marka':'Renault',
        'model':'Clio',
        'üretim': 2012,
        'renk': 'Gümüş gri',
    }
}
class otomobil():
    def __init__(self,marka,model,uretim,renk):
        self.marka = marka; self.model = model; self.uretim = uretim; self.renk = renk
    def islemler():
        print("1: Otomobil arama, 2: Otomobil ekleme")
        islem = int(input("Yapacağınız işlemi yazınız: "))
        if islem == 1:
            otomobil.oto_cagir()
        elif islem == 2:
            otomobil.oto_ekle()
        else:
            print("Hatalı giriş!")
    def oto_cagir():
        k_secim = input("Hangi marka araba istiyorsunuz: ").strip().title()
        for i in otomobillerr:
            n = otomobillerr[i]['marka']
            if k_secim == n:
                print("""
Marka :{}
Model :{}
Üretim:{}
Renk  :{}\n""".format(otomobillerr[i]['marka'],otomobillerr[i]['model'],otomobillerr[i]['üretim'],otomobillerr[i]['renk']))
                break
            else:
                continue
    def oto_ekle():
        marka = input("Marka bilgisi: "); model = input("Model bilgisi: "); uretim = input("Üretim bilgisi: "); renk = input("Renk bilgisi: ")
        otomobillerr.update({3:{'marka': marka, 'model': model, 'üretim':uretim, 'renk':renk},})

otomobil.islemler()
print(otomobillerr)

Şunu farkettim. gereksiz yere self koydurtmuyor :smiley:

ilk başta sadece araç ekleme yapacaktım sonradan vazgeçtim. Sizce nasıl verimli kullanılır buralar?

Sorunun cevabını bildiğinizi düşünüyorum. :stuck_out_tongue:

class MyClass:
    def __new__(cls):
        myself = super().__new__(cls)
        myself.hello = "hello"
        return myself
        
    def __init__(self):
        print(self.hello)
       
                
myclass = MyClass()

O halde inşa edici fonksiyon __init__ değil, __new__. Ve __init__'ten önce __new__ örtük olarak çağrılıyor.

1 Beğeni
otomobillerr = {
    1:{
        'marka':'Opel',
        'model':'Astra',
        'üretim': 2015,
        'renk': 'Siyah',
        'fiyat': 150000
    },
    2:{
        'marka':'Renault',
        'model':'Clio',
        'üretim': 2012,
        'renk': 'Gümüş gri',
        'fiyat': 105000
    },
    3:{
        'marka':'Renault',
        'model':'Symbol',
        'üretim':2015,
        'renk':'Beyaz',
        'fiyat': 135000
    }
}
class otomobil():
    def islemler(self):
        print("1: Otomobil arama, 2: Otomobil ekleme")
        islem = int(input("Yapacağınız işlemi yazınız: "))
        if islem == 1:
            self.oto_cagir()
        elif islem == 2:
            otomobil.oto_ekle()
        else:
            print("Hatalı giriş!")
    def oto_cagir(self):
        self.k_secim = input("Hangi marka araba istiyorsunuz: ").strip().title()
        self.oto_goster()
    def oto_ekle():
        marka = input("Marka bilgisi: "); model = input("Model bilgisi: "); uretim = input("Üretim bilgisi: "); renk = input("Renk bilgisi: ")
        otomobillerr.update({3:{'marka': marka, 'model': model, 'üretim':uretim, 'renk':renk},})
    def oto_sil(self):
        pass
    def oto_goster(self):
        for i in otomobillerr:
            n = otomobillerr[i]['marka']
            if self.k_secim == n:
                print("""
Marka :{}
Model :{}
Üretim:{}
Renk  :{}
Fiyat :{}\n""".format(otomobillerr[i]['marka'],otomobillerr[i]['model'],otomobillerr[i]['üretim'],otomobillerr[i]['renk'],otomobillerr[i]['fiyat']))
                continue
            else:
                continue


otomobil.islemler()
print(otomobillerr)

TypeError: islemler() missing 1 required positional argument: ‘self’

Bu hatanın sebebi tam olarak nedir?

islemler(), otomobil() nesnesine ait bir instance metod. otomobil sınıfına ait bir class method değil. Hatayı bu yüzden alıyorsunuz. otomobil().islemler() şeklinde çağırmanız gerekiyor.

1 Beğeni
otomobillerr = {
    1:{
        'marka':'Opel',
        'model':'Astra',
        'üretim': 2015,
        'renk': 'Siyah',
        'fiyat': 150000
    },
    2:{
        'marka':'Renault',
        'model':'Clio',
        'üretim': 2012,
        'renk': 'Gümüş gri',
        'fiyat': 105000
    },
    3:{
        'marka':'Renault',
        'model':'Symbol',
        'üretim':2015,
        'renk':'Beyaz',
        'fiyat': 135000
    }
}
class otomobil():
    def islemler(self):
        print("1: Otomobil arama, 2: Otomobil ekleme")
        islem = int(input("Yapacağınız işlemi yazınız: "))
        if islem == 1:
            self.oto_cagir()
        elif islem == 2:
            otomobil.oto_ekle()
        else:
            print("Hatalı giriş!")
    def oto_cagir(self,k_secim):
        # self.k_secim = input("Hangi marka araba istiyorsunuz: ").strip().title()
        self.ksecim = k_secim
        self.oto_goster()
    def oto_ekle():
        marka = input("Marka bilgisi: "); model = input("Model bilgisi: "); uretim = input("Üretim bilgisi: "); renk = input("Renk bilgisi: ")
        otomobillerr.update({3:{'marka': marka, 'model': model, 'üretim':uretim, 'renk':renk},})
    def oto_sil(self):
        pass
    def oto_goster(self):
        for i in otomobillerr:
            n = otomobillerr[i]['marka']
            if self.ksecim == n:
                print("""
Marka :{}
Model :{}
Üretim:{}
Renk  :{}
Fiyat :{}\n""".format(otomobillerr[i]['marka'],otomobillerr[i]['model'],otomobillerr[i]['üretim'],otomobillerr[i]['renk'],otomobillerr[i]['fiyat']))
                continue
            else:
                continue

otomobil().islemler('Renault')
print(otomobillerr)

Hocam peki böyle bir mantık yanlış mıdır?

TypeError: islemler() takes 1 positional argument but 2 were given

Şu hatayı veriyor.

Bahsettiğim kısımlar:

islemler() metodu self dışında bir argüman almıyor. Niye 'Renault' gibi bir stringi argüman olarak veriyorsunuz?

Ayrıca aldığınız hataları ve yazdığınız kodu biraz inceleyin lütfen.

Daha iyi anlamak için olaya tekrar farklı bir göz ile bakıp, düşüneyim dedim. Şu kanaate vardım.
değişkenler class içerisinde ise class insandır, değişkenler ise üzerindeki eli, göze, bacağıdır ve ayrılmazlar.
Ancak class içerisinde değil ise, eli, ayağı vücudundan ayrı, kopuk bir parçadır. Yani ortada vücud yoktur, parça vardır.

Üzgünüm bende yazdıktan sonra farkettim. Buradaki yazıyı düzenledim sanmıştım ama taslak olarak kayıt etmişim.