OOP-class instance

Merhaba;

class Personel():
    def __init__(self):
        name = input("İsim ?: ")
        self.name = name
personel_1 = Personel()  

“personel_1 = Personel()” şeklinde olan örneklemeyi kullanıcı başka şekilde nasıl oluşturabilir ?

Kaç personel olacağı belli olsa ben tüm örneklemeleri oluştururum ama belli değil.

Kullanıcının “personel_1 = Personel()” bu şekilde bir örneklemeyle uğraşmasını istemiyorum. Başka nasıl yapabilirim ?

Merhaba, sorunuzu biraz daha açabilir misiniz, böylelikle size yardım edebilmemiz daha da kolaylaşır. Bu iş için liste mekanizması tam size göre gibi görünüyor.

personel_listesi = []
name = ""
while(name != "-1"):
    name = input ()
    personel_listesi.append(Personel(name))

Tabi __init__ içindeki input i çıkarırsın mesela.

Eğer bize sorununu daha açıklayıcı bir şekilde açıklarsan belki daha fazla feedback verebilirim, verebilirler.

1 Beğeni

Vereceğim kod biraz uzun olacak ama anlatmak istediğim şeyi belki anlatabilirim.

import time
import random
import sys

class Oyuncu():
    def __init__(self, isim, can=5, enerji=100):
        self.isim = isim
        self.darbe = 0
        self.can = can
        self.enerji = enerji
        
    def mevcut_durumu_görüntüle(self):
        print('darbe: ', self.darbe)
        print('can: ', self.can)
        print('enerji: ', self.enerji)
        
    def saldır(self):
        print('Bir saldırı gerçekleştirdiniz.')
        print('Saldırı sürüyor. Bekleyiniz.')
        
        for i in range(10):
            time.sleep(.3)
            print('.', end='', flush=True)
            
        sonuç = self.saldırı_sonucunu_hesapla()
        
        if sonuç == 0:
            print('\nSONUÇ: kazanan taraf yok')
            
        if sonuç == 1:
            print('\nSONUÇ: rakibinizi darbelediniz')
            self.darbele(rakip)

        if sonuç == 2:
            print('\nSONUÇ: rakibinizden darbe aldınız')
            self.darbele(siz)  # siz yerine self yazılabilir
            
    def saldırı_sonucunu_hesapla(self):
        return random.randint(0, 2)
    
    def kaç(self):
        print('Kaçılıyor...')
        for i in range(10):
            time.sleep(.3)
            print('\n', flush=True)
            
        print('Rakibiniz sizi yakaladı')
        
    def darbele(self, darbelenen):
        darbelenen.darbe += 1
        darbelenen.enerji -= 1
        if (darbelenen.darbe % 5) == 0:
            darbelenen.can -= 1
            
        if darbelenen.can < 1:
            darbelenen.enerji = 0
            print('Oyunu {} kazandı!'.format(self.isim))
            self.oyundan_çık()
            
    def oyundan_çık(self):
        print('Çıkılıyor...')
        sys.exit()
        
##################################
# Oyuncular
siz = Oyuncu('Ahmet')
rakip = Oyuncu('Mehmet')

# Oyun başlangıcı
while True:
    print('Şu anda rakibinizle karşı karşıyasınız.',
                'Yapmak istediğiniz hamle: ',
                'Saldır: s',
                'Kaç: k',
                'Çık: q', sep='\n')
    
    hamle = input('\n> ')
    if hamle == 's':
        siz.saldır()
        
        print('Rakibinizin durumu')
        rakip.mevcut_durumu_görüntüle()
        
        print('\nSizin durumunuz')
        siz.mevcut_durumu_görüntüle()
        
    if hamle == 'k':
        siz.kaç()
        
    if hamle == 'q':
        siz.oyundan_çık() 

Mesela burada instance ler kod içerisinde oluşturulmuş.

Oyuncular

siz = Oyuncu(‘Ahmet’)
rakip = Oyuncu(‘Mehmet’)

Ben böyle yapamam çünkü personel sayısı belli değil. Peki sınıfımı nasıl örnekleyebilirm ?

Programım çalıştığında kullanıcının örnek oluşturabilmesinin başka yolu yok mudur ?
Mesela bir değişken tanımlatma işini kullanıcıya verirsek;

a = 2

şeklinde yazmasını bekleriz.
Ama input olarak alırsak kullanıcıyı tanımlama işiyle uğraştırmamış olurum.

a = input()

Buradaki kullanıcı kim? Uygulamayı kullanacak kişi mi? Eğer öyle ise kullanıcı neden kod yazıyor?

Kaç personel olacağının en başta belli olup olmamasının bir önemi yok. Personelleri ihtiyaç duydukça oluşturabilirsiniz.

Tamda anlatmak istediğim nokta bu. Ben nasıl bir kod eklemeliyim ki programı kullanacak olan kişi kod yazmadan sınıfın bir örneği oluşsun böyle bir şey mümkün mü ?

Kullanıcı ne yapınca bir örnek oluşması lazım?

class Komisyoncu():
    köylüler = []
    
    def __init__(self):
        self.kasa = 0
        self.kg = 0
        self.tl = 0
        
    @classmethod
    def köylü_ekle(cls):
        cls.köylü_adı = input("Köylü adı : ")
        cls.köylüler.append(cls.köylü_adı)
        print("{} kişisi eklendi".format(cls.köylü_adı))

    def kasa_ekle(self):
        kasa_adet = input("Kaç kasa? : ")
        self.kasa += kasa_adet

    def kg_ekle(self):
        kaç_kg = input("Kaç kg ? : ")
        self.kg += kaç_kg

    def tl_ekle(self):
        tl_miktar = input("kaç TL ? : ")
        self.tl += tl_miktar

    def kayıtlar(self):
        pass

while True:
    print("""Köylü ekle : "e",
            Kasa ekle : "k",
            Kg ekle : "a",
            TL ekle : 'p'
            Kayıtlar : 'v' """)

    cevap = input(">---")
    
    if cevap == "e":
        Komisyoncu.köylü_ekle()

    elif cevap == "k":
        pass

    elif cevap == "a":
        pass

    elif cevap == "p":
        pass
    elif cevap == "v":
        pass
        
            

Burada kullanıcı köylü eklediğinde örnek oluşmasını istiyorum ki eklenen köylülerin niteliklerine erişebileyim.

Niye burada bir köylü oluşturup listeye onu eklemiyorsunuz o halde?

Rica etsem örnek kod gösterir misiniz ?

cls.köylüler.append(Köylü(cls.köylü_adı)) 

Hocam yazdığınız “Köylü” tanımlı değilki.

Amacım köylüler eklendikten sonra her birinin tek tek niteliklerine ulaşabilmek. köylü_1.kasa, köylü_2.kg gibi.

Merhaba tekrar,

@EkremDincel in anlatmaya çalıştığı şey şu:

class Koylu:
    def __init__(self, ad):
        self.ad = ad
    def adini_soyle(self):
        print("Ben", self.name, "adlı köylüyum")

class Komisyoncu:
    koyluler = []
    @classmethod
    def koylu_ekle(cls, köylü):
        cls.koyluler.append(köylü)

    @classmethod
    def butun_koyluleri_konustur(cls):
        for koylu in cls.koyluler:
            koylu.adini_soyle()


Komisyoncu.koylu_ekle(Koylu("Ahmet"))
Komisyoncu.koylu_ekle(Koylu ("Mehmet"))
Komisyoncu.koylu_ekle(Koylu("Zeynep"))
Komisyoncu.koylu_ekle(Koylu ("Belkıs"))
Komisyoncu.butun_koyluleri_konustur()

Burada olduğu gibi köylüler icin bir class tanımlarsın, bir de komisyoncu için bir class olusturursun. Devamını zaten biliyorsun. Ekrem beyin anlatmaya çalıştığı şey bu anladığım kadarıyla. Umarım yardımcı olabilmişimdir. Hayırlı geceler.

(Kodu deneyemedim, gerekli yerlere düzenleme yaparım müsait vakitte, ama pseudo bu)

2 Beğeni

Cevaplar için teşekkürler hocam.

1 Beğeni

Burada classmethod kullanmayi gerektiren hic bir sey goremiyorum arkadaslar. Tek instance’i olan class yaratmaktan cekinip isleri bosuna zorlastiriyorsunuz gibi gozukuyor.

Sinif degiskenleri (koyluler) kullanmaya da gerek yok. Ornek degiskenleri (self.koyluler) yeter.

1 Beğeni

Ben de göremiyorum hocam da soru soran kişi, classmethod alıştırması yapıyordur diye düşünmüştüm. Bu yüzden kendi adıma işin o tarafını pek kurcalamak istememiştim. Ama yazmak lazımdı bunu da, haklısınız.

Örnekleme işlemini köylü eklemeyle birlikte yaptığım için örnekleme yapmadığım takdirde örnek niteliğine erişemem diye o şekilde kullanmıştım hocam.

Kodların son hali bu şekilde…

import time

class Koylu:
    koyluler = dict()  #İnstance aracılığıyla erişmek için dictionary kullanıldı
    
    def __init__(self, ad, kasa, kg, tl):
        self.ad = ad
        self.kasa = kasa
        self.kg = kg
        self.tl = tl
        
    @classmethod
    def koylu_ekle(cls, ad, koylu):
        cls.koyluler[ad] = koylu  #Value değerine Koylu sınıfınının örneğini atıyoruz
        
        #with open("köylüler.txt", "a") as f:
          #  f.write(str(cls.koyluler))
        time.sleep(.5)
        
    @classmethod
    def koylunun_kayitlarini_bastir(cls, ad):
        koylu = cls.koyluler[ad]
        print("_"*15)
        print("İsim:", koylu.ad)
        print("Kasa:", koylu.kasa)
        print("Kg:", koylu.kg)
        print("TL:", koylu.tl)

    @classmethod
    def all_records(cls):  
        for i in cls.koyluler.keys():
            Koylu.koylunun_kayitlarini_bastir(i)
        print("_"*15)
        time.sleep(1.5)

    def veri_ekle(self, ad):
        print("Ne eklemek istiyorsunuz ? : ")
        print("""      Kasa için : 'k'
      Kg için : 'a'
      TL için : 'p'""")
        cevap = input("--->")
        if cevap == "k":
            ekle_kasa = int(input("Kaç kasa eklenecek?: "))
            Koylu.koyluler[ad].kasa += ekle_kasa
            
        elif cevap == "a":
            ekle_kg = int(input("Kaç Kg eklenecek?: "))
            Koylu.koyluler[ad].kg += ekle_kg
            
        elif cevap == "p":
            ekle_tl = int(input("Kaç TL eklenecek?: "))
            Koylu.koyluler[ad].tl += ekle_tl
            
        time.sleep(1.5)
        
sayaç = 0     
while True:
    if sayaç == 0:
        print("***HOŞGELDİNİZ***")  #sadece ilk çalıştırmada yazılacak
    sayaç = 1
    
    print("""
Ne yapmak istiyorsunuz ?

    Köylü eklemek için : "ekle" yazın
    Köylü Kayıtları için : 'k' yazın
    Tüm kayıtlar için : "tk" yazın
    Yeni veri girişi için : "g" yazın
    """)
    cevap = input("--->")
    
    if cevap == "ekle":
        ad = input("Adı nedir?")
        kasa = int(input("Kaç kasa?"))
        kg = int(input("Kaç kg?"))
        tl = int(input("Kaç TL?"))
        koylu = Koylu(ad, kasa, kg, tl)  #Koylu sınıfını örnekliyoruz
        Koylu.koylu_ekle(ad, koylu)

    elif cevap == "k":
        ad = input("Hangi koylunun bilgilerini öğrenmek istersiniz?")
        Koylu.koylunun_kayitlarini_bastir(ad)

    elif  cevap == "tk":
        ad = input()
        #with open("köylüler.txt", "r") as f:
          #  print(f.read()[ad])
            
        if Koylu.koyluler:  #liste içeriğini boolean değeriyle kontrol ettim
            Koylu.all_records()
            
        else:
            print("KAYIT YOK!\n")
        time.sleep(1.5)

    elif cevap == "g":
        ad = input("Hangi köylünün bilgilerini güncellemek istersiniz?")
        Koylu.koyluler[ad].veri_ekle(ad)

Bunlarin iki class olmasi lazim, Koylu ve KoyluKayitDefteri gibi.

1 Beğeni

Geliştirmeye devam ediyorum, önerilere açığım. Şuan aldığım kayıtları depolamaya uğraşıyorum. Bu iş için “pickle” modülünü mü önerirsiniz ?