Python'da @staticmethod, @classmethod ve normal instance metodu arasındaki fark nedir?
Cevap
Fark, metodun ilk parametre olarak ne aldığıdır:
| Tür | İlk parametre | Erişebildiği | Tipik kullanım |
|---|---|---|---|
| Instance metodu | self (nesne) | Nesne ve sınıf durumu | Normal davranış |
@classmethod | cls (sınıf) | Sınıf durumu, alt sınıfı bilir | Alternatif constructor (factory) |
@staticmethod | Yok | Hiçbiri | Sınıfla mantıksal ilişkili yardımcı fonksiyon |
from datetime import date
class User:
min_age = 18
def __init__(self, name: str, birth_year: int):
self.name = name
self.birth_year = birth_year
def age(self) -> int: # instance
return date.today().year - self.birth_year
@classmethod
def from_dict(cls, data: dict) -> "User": # factory
return cls(data["name"], data["birth_year"])
@staticmethod
def is_valid_name(name: str) -> bool: # yardımcı
return bool(name.strip())
class Admin(User):
pass
a = Admin.from_dict({"name": "Ayşe", "birth_year": 1990})
type(a) # <class 'Admin'> : cls sayesinde alt sınıf dönerNeden classmethod factory'de önemli?
cls(...) kullandığı için miras alındığında doğru alt sınıfı üretir. Aynı şeyi @staticmethod içinde User(...) yazarak yapsaydınız Admin.from_dict bir User döndürürdü.
staticmethod sınıfın içinde durmasının tek sebebi okunabilirlik ve isim alanıdır; modül seviyesinde bir fonksiyon da çoğu zaman aynı işi görür.
İlgili Python soruları
- list ve tuple arasındaki fark nedir?
- Varsayılan argüman olarak liste vermek neden tehlikelidir?
- Decorator nedir? Basit bir zamanlama decorator'ı yazın.
- Generator nedir, yield ne yapar?
- GIL nedir ve çoklu iş parçacığını nasıl etkiler?
- async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.