Sınıf metodu oluşturma ile ilgili bir soru

Merhabalar,
Programlamaya kendi başıma python ile başladım. Kaynak olarak Fırat Özgül’ün kitabını kullanıyorum. Sınıf metodu oluşturma konusunda anlamadığım bir nokta var. Üzerine biraz düşündüm ama bir sonuca varamadım, forumda size danışayım dedim.

Kitapta konuya giriş kısmında sınıfın niteliğine örnek kullanmadan erişmek için sınıfın dışında fonksiyon tanımlamıştı, ancak import ederken bunun sıkıntı çıkardığını göstermişti. Bende bu fonksiyonu sınıf bloğunun içine alıp kullanmayı denemiştim ve çalışmıştı (personeli_görüntüle ve personel_sayısını_görüntüle fonksiyonları için):

class Çalışan():
    personel = []
   
    def __init__(self, isim):
        self.isim = isim
        self.kabiliyetleri = []
        self.personele_ekle()
    
    def personele_ekle(self):
        self.personel.append(self.isim)
        print('{} adlı kişi personele eklendi'.format(self.isim))

    def personeli_görüntüle():
        print('Personel listesi:')
        for kişi in Çalışan.personel:
            print(kişi)

    def personel_sayısını_görüntüle():
        print(len(Çalışan.personel))

    def kabiliyet_ekle(self, kabiliyet):
        self.kabiliyetleri.append(kabiliyet)

    def kabiliyetleri_görüntüle(self):
        print('{} adlı kişinin kabiliyetleri:'.format(self.isim))
        for kabiliyet in self.kabiliyetleri:
            print(kabiliyet)

Daha sonra kitap sınıf metodunu ‘@classmethod’ kullanarak oluşturmayı öğretti:

Anlamadığım kısım, benim yukarıdaki denediğim şekildede aynı şey yapılabiliyor. Sınıf metodunu ‘@classmethod’ kullanarak oluşturmanın ne faydası yada farkı var? Benim denediğim şekilde yazılan kodların eksik var mıdır ya da program içinde garip hatalara yol açar mı?

Merhaba.

Fark ettiyseniz @classmethod bezeyicisi kullanıldığında metod bir cls parametresi alıyor. Bu, o sınıf nesnesi anlamına geliyor. Sizin yazdığınızda bundan faydalanamıyorsunuz. Ayrıca bezeyici yolu daha Pythonic ve okuması kolay.

İyi çalışmalar.

1 Beğeni

Yanlışım varsa düzeltin ,
O kodlarda personel listesi örnekleme ile doğrudan bağlantılı yani self alanını kullanıyor bu yüzden örnek ismini kullanarak çağrılması gerek yoksa hatalı olması gerekmez mi?
Ikinci kısımda kendine yeni bir erişim alanı tanıyor
böylece sinif adi üzerinden erişilebiliyor.

Denemedim kodu yanlışım varsa affola.

1 Beğeni

Evet, örnek ile çağırıldığında hata veriyor, galiba örneği argüman olarak kabul ediyor. Sınıf metodu olarak tanımlamak daha doğru ve @ismailarilik’ın dediği gibi pythonicmiş.
Aslında biraz saçma bi soru sormuşum galiba :disappointed: kusura bakmayın. Acemiliğime verin :slightly_smiling_face:

Bence gayet mantıklı bir soru. Ayrıca sayenizde yeni bir şey öğrenmiş oldum. Python’da sınıf nitelikleri ile nesne nitelikleri biraz birbirine girmiş sanırım. :slight_smile:

1 Beğeni

siniflarda temelde birer nesne degil midir ?

Aynen öyle; Python’da her şey nesnedir (Birkaç küçük istisna dışında.).

1 Beğeni