ProgramlamaPython geliştirici

Python'da sınıf yöntemleri, statik yöntemler ve örnek yöntemleri arasındaki farkı açıklayın. Her birinin nasıl uygulanacağını ve ne zaman kullanılacağını açıklayın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

  • Örnek yöntemi (self) belirli bir nesne ile çalışır, durumunu okuyabilir ve değiştirebilir.
  • Sınıf yöntemi (cls) ilk argüman olarak sınıfı alır (örneği değil), fabrikalar ve yardımcı fonksiyonlar için yararlıdır.
  • Statik yöntem, ne self ne de cls almaz; bu, sınıf içinde mantıksal olarak gruplandırılması kolay bir işlevdir.

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:

  • Örnek yöntemler her zaman self ile çalışır (sınıf örneği).
  • Sınıf yöntemleri, bir örnek oluşturmadan sınıf ile çalışma gerektiren durumlar için gereklidir.
  • Statik yöntemler, sınıfın bağlamına veya nesnesine ihtiyaç duymadan "yardımcı" işlevler için kullanışlıdır.

İkna edici sorular.

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.

Tipik hatalar ve anti-paterni

  • staticmethod ve classmethod karıştırılır.
  • classmethod içinde self'e erişmeye çalışılır (veya tersine).
  • staticmethod kullanılırken sınıfa erişim gerektiğinde kullanılır.

Hayat örneği

Olumsuz durum

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:

  • Statik bir yöntem tanımlamak daha kolay görünüyordu.

Eksiler:

  • Türetilmiş sınıfların örnekleri düzgün bir şekilde oluşturulamıyor — her zaman temel sınıf dönüyor.

Olumlu durum

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:

  • Doğru miras alma.
  • Esnek mimari.

Eksiler:

  • staticmethod ile classmethod arasındaki farkı anlamayı gerektirir.