@staticmethod vs modül seviyesi işlevi


21

Bu @staticmethodve hakkında değil @classmethod! Nasıl staticmethodçalıştığını biliyorum . Bilmek istediğim, @staticmethodmodül düzeyinde bir işleve karşı uygun kullanım durumları .

Bu soruyu araştırdım ve modül düzeyinde işlevlerin statik yöntemlere göre tercih edildiğine dair bazı genel anlaşmalar var çünkü daha pitonik. Statik yöntemlerin, sınıfına bağlı olma avantajı vardır, bu da yalnızca bu sınıf onu kullanıyorsa mantıklı olabilir. Ancak, Python işlevselliği genellikle sınıf değil modül tarafından düzenlenir, bu nedenle genellikle bir modül işlevi yapmak da mantıklıdır.

Statik yöntemler alt sınıflar tarafından geçersiz kılınabilir, bu da ona nasıl baktığınıza bağlı olarak bir avantaj veya dezavantajdır. Her ne kadar, statik yöntemler genellikle "işlevsel olarak saf" olsa da, bu geçersiz kılmak akıllı olmayabilir, ancak bazen uygun olabilir (ancak bu "uygun, ancak ASLA YAPMAYIN" türlerinden sadece deneyim size öğretebilir).

Statik yöntem veya modül düzeyindeki işlevleri kullanmak için genel bir genel kural var mı? Ne gibi somut avantajları veya dezavantajları var (örn. Gelecekteki genişletme, harici genişletme, okunabilirlik)? Mümkünse, bir vaka örneği de verin.

Yanıtlar:


11

Teknik olarak statik bir yöntem ve bir modül işlevi hemen hemen aynı şekilde davranır - Her iki durumda da standart işlevler gibi çalışırlar, fark yerleştirildikleri ad alanıdır. Dolayısıyla karar, sürdürülebilirlik / okunabilirlikten daha fazlasıdır.

Bu kriterlerin bir kısmı veya tamamı karşılanırsa genellikle statik bir yöntem kullanırsınız:

  • Normal yöntemlerle zaten mevcut bir sınıf var
  • İşlev genellikle sınıftaki nesnelerle ilgilidir, ancak belirli bir örnekle değil
  • Muhtemelen istemcinin kodunu kırmadan yöntemi statik olmayan yapmak isteyebileceğiniz için, yöntemi statik olmayan bir yöntemmiş gibi çağırabilirsiniz.

0

Bir program gerçekliğin bir simülasyonudur. Bu şekilde, gerçekliği nasıl algıladığınıza bağlıdır.

Bir işlev bazı etkinlikleri temsil eder. Etkinlik ne kadar genel olursa, etkinliği bir işlevle simüle etme eğilimi o kadar büyük olur. Yöntemler sınıflara bağlıdır. Etkinlik sınıfa ne kadar spesifik olursa, bir yöntemle o kadar benzetme eğilimi gösterir.

Trigonometrik fonksiyonları düşünün. Deyin ki, o sin()kadar iyi biliniyor ki, açılara uyduğunu biliyorsunuz. Giriş olarak bir float numarası istediğini ve float'ı döndürdüğünü biliyorsunuz. Her neyse, bir sınıf tarafından temsil edilen bir açı veri türü .sin()olabilir ve argüman olmadan angle nesnesiyle çalışan normal bir yöntem olabilir ve .sin(x)tek bir argümanla sınıfın statik bir yöntemi olabilir. Bahse girerim, daha fazla insan sin()basit bir işlev yapmanın daha iyi olduğunu düşünür . Daha alışkınlar.

Başka bir bakış açısı : Bir modül bir sınıf örneğine benzer. Kendi üye değişkenleri ve üye fonksiyonları vardır. Bir anlamda, tek bir desen uygular. Uygulamanın başka bir modülünden her içe aktardığınızda, aynı değişkenlere ve işlevlere erişebilirsiniz.


0

Bağımsız değişken olarak bir nesnenin derin veri hiyerarşisinin bir kısmını alacak bir işlevi var. Bunun yerine veri hiyerarşisinin bu kısmına ulaşmak için gereken birkaç argümanı iletmek zahmetli olacaktır. Bu yüzden benlik veya cls referans için bir neden yok. Ancak işlevsellik yalnızca belirli bir sınıftaki nesnelerin bölümlerinde kullanılacaktır. Yani bana göre bir sınıf yöntemi gibi görünüyor.

Ayrıca, sınıf adını almayı tercih ediyorum ('import module' yerine 'module import class'dan'). Fonksiyonu statik bir yöntem olarak dahil etmek, modüle bir işlev olarak yazarken yönteme erişmemi sağlar farklı bir içe aktarma gerektirir.


2
Ben olsaydım, ilk kişiye cevap vermekten kaçınırdım. Kafa karıştırıcı. Bunun yerine ikinci kişiyi askere yazmalısınız.
Aaron Hall

Belki. Ben askerin aklında olanlarla eşleşip eşleşmeyecek bir örnek kullanım örneği sunuyordum.
DVD Avins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.