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
aib
Ağustos 5, 2021, 12:19ös
15
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)
aib
Ağustos 6, 2021, 9:52öö
19
Bunlarin iki class olmasi lazim, Koylu
ve KoyluKayitDefteri
gibi.
1 Beğeni
alfaplt
Ağustos 6, 2021, 12:57ös
20
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 ?