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 parametreErişebildiğiTipik kullanım
Instance metoduself (nesne)Nesne ve sınıf durumuNormal davranış
@classmethodcls (sınıf)Sınıf durumu, alt sınıfı bilirAlternatif constructor (factory)
@staticmethodYokHiçbiriSı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öner

Neden 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.

  1. list ve tuple arasındaki fark nedir?KolayPythonBackend
  2. Varsayılan argüman olarak liste vermek neden tehlikelidir?OrtaPythonBackend
  3. Decorator nedir? Basit bir zamanlama decorator'ı yazın.OrtaPythonBackend
  4. Generator nedir, yield ne yapar?OrtaPythonBackend
  5. GIL nedir ve çoklu iş parçacığını nasıl etkiler?ZorPythonBackend
  6. async/await ve asyncio nasıl çalışır? Ne zaman thread veya process yerine tercih edilir?ZorPythonBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle