Python'da üç ana tür yöntem vardır: örnek yöntemleri, sınıf yöntemleri ve statik yöntemler. Tarihsel olarak Python yalnızca örnek yöntemlerini desteklemiştir (ilk parametre self ile). Zamanla, nesneye bağlı olmadan sınıf üzerinden erişilebilen ve sınıfa erişim sağlayan ek yöntem türlerine olan ihtiyaç belirmiştir.
Problem: Sıklıkla, nesne örneğinin durumuna bağlı olmayan (örneğin, fabrika yöntemleri) veya sınıf bağlamına ihtiyaç duymadan ancak sınıf yapısına mantıksal olarak dahil olan yöntemler oluşturmak gerekebilir.
Çözüm: @classmethod ve @staticmethod dekoratörleri kullanılır.
Kod örneği:
class Example: def instance_method(self): return f'instance: {self}' @classmethod def class_method(cls): return f'class: {cls}' @staticmethod def static_method(): return 'static'
Ana özellikler:
Statik yöntem sınıfın veya nesnenin özelliklerine erişebilir mi?
Hayır, statik yöntem ne sınıfa ne nesneye bir referans alır.
class A: x = 10 @staticmethod def f(): # print(self.x) # Hata pass
Sınıf yöntemleri miras alanlarda geçersiz kılınabilir mi?
Evet, classmethod çağrıldığında ilk argüman her zaman gerçek sınıf olur, parent değil.
class Base: @classmethod def name(cls): return cls.__name__ class Child(Base): pass Child.name() # "Child"
Neden sınıf yöntemleri için self kullanılamaz?
Çünkü sınıf yöntemi belirli bir nesne ile değil, sınıfın kendisi ile ilişkilidir; self bir örnek oluşturmadan erişilemez.
Fabrika yöntemi staticmethod olarak tanımlandı ve içinde self aracılığıyla sınıfın bir örneğini oluşturmaya çalışıyor, bu da hatalara veya kodun tekrarlanmasına yol açıyor.
Artılar:
Eksiler:
Fabrika classmethod olarak tanımlandı, içinde örneği oluşturmak için gerçek sınıf (cls) kullanıldı. Miras alanlar bu fabrika aracılığıyla düzgün bir şekilde oluşturuldu.
Artılar:
Eksiler: