Merthaba, sınıf yapıları konusunu çalışmaktayım. Şöyle bir bir kod yapım var:
class Calisan():
personel = []
def __init__(self, isim):
self.ad = isim
self.kabiliyetleri = []
self.personele_ekle()
@classmethod
def personel_sayisi(cls):
print(len(cls.personel))
def personele_ekle(self):
self.personel.append(self.ad)
print('{} adlı kişi personele eklendi'.format(self.ad))
@classmethod
def personeli_goruntule(cls):
print('Personel Listesi')
for kisi in cls.personel:
print(kisi)
def kabiliyet_ekle(self, kabiliyet):
self.kabiliyetleri.append(kabiliyet)
def kabiliyetleri_goruntule(self):
print('{} adlı kişinin kabiliyetleri: {}'.format(self.ad, self.kabiliyetleri))
def personel_kabiliyetleri(self):
for kisi in self.personel:
print('{} adlı kişinin kabiliyetleri: {}'.format(kisi, self.kabiliyetleri))
son tanımladığım metod (fikir olması açısından bu şekil bir metod verdim) ile yapmak istediğim şey sınıf içindeki her bir personele karşılık kabiliyetini yanına yazdırmak. Yani sınıfa personelleri ve kabiliyetlerini ekledikten sonra aynı anda topluca aşağıdaki gibi bir çıktı:
Ahmet adlı kişinin kabiliyeti : java
Mehmet adlı kişinin kabilieti : C++
…
nasıl ekrana basarım.
class metodu ve örnek metodu yöntemlerini denedim yapamadım. Sınıfın içinde nasıl bir kod ile bu işi çözerim?. Sınıf dışından ise nasıl çözülür?
Son olarak, personel_kabiliyetleri() fonksiyonu aşağıdaki gibi değiştirilir:
def personel_kabiliyetleri(self):
for kisi, kabiliyet in zip(self.personel, self.kabiliyet):
print('{} adlı kişinin kabiliyetleri: {}'.format(kisi, kabiliyet))
Böylece örnek üzerinden, personel sınıfındaki personellerin kabiliyetlerini listeleyebilirsiniz.
Öncelikle teşekkür ederim. Cevabınız çok yardımcı oldu. Ama hala aklımda takılan sorular var.
Örneğin ben 3 adet personel girdiğimde bunların varsayılan kabiliyet değerlerinin ‘belirtilmedi’ olmasını istedim. Ve şöyle bir kod yazdım:
class Calisan():
personel = []
kabiliyet = []
def __init__(self, isim):
self.ad = isim
self.kabiliyetleri = []
self.personele_ekle()
self.kabiliyet_ekle() ###bu satırla; başlangıçta bu fonksiyonu çalıştırarak
# girilen her personele karşılık varsayılan bir değer atamak istiyorum
@classmethod
def personel_sayisi(cls):
print(len(cls.personel))
def personele_ekle(self):
self.personel.append(self.ad)
print('{} adlı kişi personele eklendi'.format(self.ad))
@classmethod
def personeli_goruntule(cls):
print('Personel Listesi')
for kisi in cls.personel:
print(kisi)
def kabiliyet_ekle(self, kabiliyet='belirtilmedi!'): ## varsayılan değerim
self.kabiliyetleri.append(kabiliyet)
self.kabiliyet.append(kabiliyet)
def kabiliyetleri_goruntule(self):
print('{} adlı kişinin kabiliyetleri: {}'.format(self.ad, self.kabiliyetleri))
def personel_kabiliyetleri(self):
for kisi, kabiliyet in zip(self.personel, self.kabiliyet):
print('{} adlı kişinin kabiliyetleri: {}'.format(kisi, kabiliyet))
Tanımladığım 3 adet personelin ikisi için kabiliyet ekle metodu ile kabiliyetler ekliyorum. Daha sonra üçüncü personel ‘p3’ için p3.personel_kabiliyetleri()
komutunu verince
Ali adlı kişinin kabiliyetleri: belirtilmedi!
Bahtiyar adlı kişinin kabiliyetleri: belirtilmedi!
Uğur adlı kişinin kabiliyetleri: belirtilmedi!
uyarısı alıyorum. Yani eklemiyor. Bunun sebebi nedir?
Örneğe ait özelliği, property bezeyicisini kullanarak değiştirebilirsiniz.
İlk kabiliyet (self.__kabiliyet), örnekler tanımlanırken belirtilmezse, değeri “Belirtilmedi” olur. Bu değer, daha sonra, ornek.kabiliyet = yeni_değer yazılarak değiştirilebilir.
Çalışan örneklerine daha sonra yeni kabiliyetler eklemek için, kabiliyet_ekle() fonksiyonu çağrılır. Bu fonksiyon çağrıldığında; kabiliyet_listesi’ne, self.__kabiliyet’in yerine, kabiliyetler isimli bir tuple() verisi eklenir. Bu tuple() verisinin içinde, hem self.__kabiliyet, hem de yeni eklenen kabiliyetler bulunur…
Kodlar:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Calisan:
isim_listesi = []
kabiliyet_listesi = []
def __init__(self, isim, kabiliyet="Belirtilmedi"):
self.isim = isim
self.__kabiliyet = kabiliyet
self.isim_listesi.append(self.isim)
self.kabiliyet_listesi.append(self.__kabiliyet)
print("'{}' eklendi.".format(self.isim))
@property
def kabiliyet(self):
return self.__kabiliyet
@kabiliyet.deleter
def kabiliyet(self):
del self.__kabiliyet
@kabiliyet.setter
def kabiliyet(self, yeni):
try:
self.kabiliyet_listesi.remove(self.__kabiliyet)
self.__kabiliyet = yeni
self.kabiliyet_listesi.append(self.__kabiliyet)
except ValueError:
index = self.isim_listesi.index(self.isim)
self.kabiliyet_listesi.remove(self.kabiliyet_listesi[index])
self.__kabiliyet = yeni
self.kabiliyet_listesi.insert(index, self.__kabiliyet)
def kabiliyet_ekle(self, yeni):
index = self.isim_listesi.index(self.isim)
try:
self.kabiliyet_listesi.remove(self.__kabiliyet)
kabiliyetler = self.__kabiliyet, yeni
self.kabiliyet_listesi.insert(index, kabiliyetler)
except ValueError:
kabiliyetler = self.kabiliyet_listesi[index]
self.kabiliyet_listesi.remove(kabiliyetler)
kabiliyetler += yeni,
self.kabiliyet_listesi.insert(index, kabiliyetler)
def calisan_sayisi(self):
print(len(self.isim_listesi))
def calisan_goruntule(self):
for i in self.isim_listesi:
print(i)
def kabiliyeti_goruntule(self):
index = self.isim_listesi.index(self.isim)
print('{} adlı kişinin kabiliyetleri: {}'
.format(self.isim, self.kabiliyet_listesi[index]))
@classmethod
def kabiliyetleri_goruntule(cls):
for i, j in enumerate(cls.isim_listesi):
print(
"{} adlı kişinin kabiliyetleri: {}"
.format(cls.isim_listesi[i], cls.kabiliyet_listesi[i]))
c1 = Calisan(isim="C1")
c1.kabiliyeti_goruntule()
c1.kabiliyet = "Python"
c1.kabiliyeti_goruntule()
print()
c2 = Calisan(isim="C2")
c2.kabiliyeti_goruntule()
c2.kabiliyet = "Java"
c2.kabiliyeti_goruntule()
print()
c3 = Calisan(isim="C3", kabiliyet="C++")
c3.kabiliyeti_goruntule()
print()
Calisan.kabiliyetleri_goruntule()
print()
# c1'in kabiliyet demetine yeni bir değer girilir.
c1.kabiliyet_ekle(yeni="C")
c1.kabiliyeti_goruntule()
# c1'in kabiliyet demetine yeni bir değer daha girilir.
c1.kabiliyet_ekle(yeni="Ruby")
c1.kabiliyeti_goruntule()
# Demet içindeki bütün kabiliyetleri siler.
# ve kabiliyet özelliğine yeni girilen değeri ekler.
c1.kabiliyet = "Perl"
c1.kabiliyeti_goruntule()
# Yeni kabiliyet demetleri oluşturulabilir.
c1.kabiliyet_ekle("Python")
c1.kabiliyeti_goruntule()
print()
# Son listeye bakalım.
Calisan.kabiliyetleri_goruntule()
Yukarıdaki kodları çalıştırdığım zaman aldığım çıktı: