Fonksiyonu bir classmethod
'a dönüştürseniz bu sorun ortadan kalkar.
class Deneme:
bos_liste = []
@classmethod
def ekle(cls):
cls.bos_liste.append(1)
Deneme.ekle()
print(Deneme.bos_liste)
Bir sınıf özelliği olan bos_liste
'yi kullanmayacaksanız istediğiniz gibi bir fonksiyon oluşturulabilir:
class Deneme:
def say_hello():
print("hello")
say_hello()
Ayrıca sınıfın içindeki bir özelliği kullanmak için başında ya cls
ya da self
ifadesi olmak zorunda. Sınıf blokunun içinde cls
tanımsızdır. Yani şöyle yapamayız.
class Deneme:
bos_liste = []
@classmethod
def ekle(cls):
cls.bos_liste.append(1)
cls.ekle()
Bu yukarıdaki kodlar bize NameError
hatası yükseltir.
Özetle bir sınıfın şöyle bir özelliği varsa.
class X:
x = 1
Buradaki x
niteliği sınıf metotlarında cls.x
şeklinde kullanılır yok eğer örnek metodu oluşturmak istiyorsanız da self.x
şeklinde kullanılır.
Sınıf niteliğinin isminin başında cls
veya self
olmadan, niteliğin tanımlandığı blok altında local
bir alana geçmediğiniz müddetçe işlem yapabilirsiniz:
class Deneme:
bos = []
bos.append(1)
Ancak bos
ile işlem yapan bir fonksiyon tanımlarsanız, bu bos
değişkeni cls.bos
veya self.bos
şeklinde kullanılmazsa bos
değişkeni tanımsız olur.
Bu arada bos_listeyi
doğrudan değil ama argüman olarak kullanabilirsiniz:
class Deneme:
bos = []
def ekle(arg):
arg.append(1)
Deneme.ekle(Deneme.bos)
print(Deneme.bos)
veya şöyle:
class Deneme:
bos = []
def ekle(arg):
arg.append(1)
ekle(bos)
Bu arada python’da bir sınıf içerisindeki metot, sınıfa ait bir özelliği kullanmayacaksa fonksiyonun üstüne @staticmethod
bezeyicisi yazılır. Eğer bir sınıf niteliği veya metodu ile işlem yapan bir fonksiyon tanımlanacaksa da @classmethod
yazılır.