Class ile ilgili bir sorunum var

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?

Merhabalar,

Yazdığınız kodlarda ufak değişiklikler yapmak lazım:

  1. Önce sınıfa ait bir kabiliyet listesi tanımlanır.
class Calisan:
    personel = []
    kabiliyet = []
  1. Daha sonra her kabiliyet_ekle() fonksiyonu çağrıldığında, sınıfa ait olan kabiliyet listesine, personel kabiliyeti eklenir.
    def kabiliyet_ekle(self, kabiliyet):
        self.kabiliyetleri.append(kabiliyet)
        self.kabiliyet.append(kabiliyet)
  1. 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.

1 Beğeni

Ö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ı: