Yeni pycharm sürümü (3.1.3 topluluk sürümü), mevcut nesnenin durumuyla çalışmayan yöntemleri statik hale dönüştürmeyi önerir.
Bunun pratik nedeni nedir? Bir çeşit mikro performans (-ya da-hafıza) -optimizasyon?
Yeni pycharm sürümü (3.1.3 topluluk sürümü), mevcut nesnenin durumuyla çalışmayan yöntemleri statik hale dönüştürmeyi önerir.
Bunun pratik nedeni nedir? Bir çeşit mikro performans (-ya da-hafıza) -optimizasyon?
return 1
tek satırlık uygulaması var. "Daha fazla" yararlı hiçbir şey içermiyor
Yanıtlar:
PyCharm , statik bir yönteme sahip olmak istemiş olabileceğinizi "düşünüyor" , ancak siz bunun statik olduğunu bildirmeyi unuttunuz ( @staticmethod
dekoratör kullanarak ).
PyCharm bunu önerir çünkü yöntem kendi gövdesinde kullanmaz self
ve dolayısıyla sınıf örneğini gerçekten değiştirmez . Dolayısıyla yöntem statik olabilir, yani bir sınıf örneğini geçmeden veya bir sınıf örneği oluşturmadan çağrılabilir.
NotImplementedError
.
self
. Bu durumda uyarı ihmal edilebilir ve işaretliyorum # noinspection PyMethodMayBeStatic
. IntelliJ IDEA'nın bu uyarının bağlam menülerine bu devre dışı bırakma açıklamasını eklemeyi teklif etmemesi ne yazık ki.
@Jolvi, @ArundasR ve diğerleri ile anlaşmaya varıldığında, uyarı kullanmayan bir üye işlevinde gerçekleşir self
.
PyCharm'ın yanlış olduğundan, işlevin a olmaması gerektiğinden @staticmethod
eminseniz ve sıfır uyarıya değer veriyorsanız, bunu iki farklı yoldan kaldırabilirsiniz:
Geçici Çözüm 1
def bar(self):
self.is_not_used()
doing_something_without_self()
def is_not_used(self):
pass
Çözüm 2 [Teşekkürler @ DavidPärsson ]
# noinspection PyMethodMayBeStatic
def bar(self):
doing_something_without_self()
Bunun için sahip olduğum uygulama (@staticmethod'u kullanamamamın nedeni), bir protokol alt türü alanına yanıt vermek için bir eylemci işlevleri tablosu oluşturmaktı. Elbette tüm işleyiciler aynı biçimde olmalıdır (statik veya statik olmayan). Ancak bazıları örnekle hiçbir şey yapmadı. Bunları statik yaparsam, "TypeError: 'staticmethod' nesnesi çağrılabilir değil" alırdım.
OP'nin şaşkınlığını desteklemek için, yapabildiğiniz her zaman statik yöntem eklemenizi önermek, kodu daha fazla yapmaktan daha sonra daha az kısıtlayıcı hale getirmenin daha kolay olduğu ilkesine aykırıdır - bir yöntemi statik hale getirmek onu şimdi daha az kısıtlayıcı hale getirir. instance.f () yerine class.f () öğesini çağırın.
Bu uyarının neden var olduğunu tahmin eder:
# noinspection PyMethodMayBeStatic
Yöntemin veya sınıfın üstüne eklemek uyarıyı bastırır ve bence boş bir yöntemi çağırmaktan daha iyidir.
self
hiç kaldırılmaz.
Burada verilen cevaplara katılıyorum (yöntem kullanılmaz self
ve bu nedenle süslenebilir @staticmethod
).
Yöntemi bir sınıf içinde statik bir yöntem yerine üst düzey bir işleve taşımak isteyebileceğinizi de eklemek isterim. Ayrıntılar için şu soruya ve kabul edilen yanıta bakın: python - statik yöntemler veya üst düzey işlevleri kullanmalı mıyım
Yöntemi üst düzey bir işleve taşımak PyCharm uyarısını da düzeltecektir.
self
bir parametre değilse zaten statik bir yöntem değil, üst düzey bir işlev oluşturacaktır .
self
ve bu nedenle üst düzey olabilecek bir yönteme sahip bir sınıfım var , ancak bu yöntemin ne yaptığına bakıldığında bu mantıklı gelmiyor - üst düzey olarak daha çok küresel bir yöntem gibi görünecek, aslında bu sınıftan oluşturulan örnekler için küçük bir yardımcı yöntem. Bu nedenle, kodumu mantıksal olarak organize etmek için dekoratör mükemmel bir çözümdür.
Statik olarak tanımlanan bir sınıf yöntemine sahip olmanın aşağıdaki avantajlarını hayal edebiliyorum:
Kalan avantajlar, eğer mevcutsa muhtemelen marjinaldir:
bit
daha hızlı koşmak önemli değildir (çünkü her iki durumda da hızlı çalışırlar) ve bildiğiniz gibi bilgisayarların bunch
belleği vardır, bu yüzden artık bir sorun değildir. Ayrıca ilk düşüncenize dikkat edin: Bu, nesneye yönelik değil, prosedürel bir davranıştır.
Eğer söz etmemişlerdir beri self
de bar
yöntem gövdesine eğer, pycharm soruyor olabilir yapmak istedim bar
statik. Java gibi diğer programlama dillerinde, statik bir yöntem bildirmek için bariz nedenler vardır. Python'da, bir statik yöntemin (AFIK) tek gerçek yararı, onu sınıfın bir örneği olmadan çağırabilmektir. Bununla birlikte, tek sebebiniz buysa, muhtemelen en üst düzey bir işleve gitmeniz daha iyi - burada not edildiği gibi .
Kısacası, neden orada olduğundan yüzde yüz emin değilim. Muhtemelen gelecek sürümde kaldıracaklarını tahmin ediyorum.
Test örnek oynatıcımı kullanarak işlevimi yanlışlıkla yazdığımı fark etmediğim için bu hata mesajı bana bir grup yardımcı oldu
my_player.attributes[item]
doğru yol yerine
self.attributes[item]
Pycharm'ın bunu bir uyarı olarak yapmasının nedeni, çünkü Python, hiçbir statik yöntemi çağırırken ilk argüman olarak self'i iletecektir (@staticmethod'u eklemeyin). Pycharm bunu biliyor.
Misal:
class T:
def test():
print "i am a normal method!"
t = T()
t.test()
output:
Traceback (most recent call last):
File "F:/Workspace/test_script/test.py", line 28, in <module>
T().test()
TypeError: test() takes no arguments (1 given)
Java'lıyım, Java'da "self" "bu" olarak adlandırılır, sınıf yönteminde argüman olarak self (veya bunu) yazmanıza gerek yoktur. Yöntemin içinde ihtiyaç duyduğunuzda kendini çağırabilirsiniz. Ancak Python, kendini bir yöntem argümanı olarak "geçmek zorundadır".
Bunu anlayarak @ BobStein yanıtı olarak herhangi bir Geçici Çözüme ihtiyacınız yoktur.
self
Öyleyse ne geçer ?
Biraz dağınık olabilir, ancak bazen erişmeniz gerekmez self
, ancak yöntemi sınıfta tutmayı ve statik hale getirmemeyi tercih edersiniz . Ya da bir grup çirkin dekoratör eklemekten kaçınmak istersiniz. İşte bu durum için bazı olası geçici çözümler.
Metodunuzun yalnızca yan etkileri varsa ve ne getireceği umurunuzda değilse:
def bar(self):
doing_something_without_self()
return self
Dönüş değerine ihtiyacınız varsa:
def bar(self):
result = doing_something_without_self()
if self:
return result
Şimdi yönteminiz kullanıyor self
ve uyarı ortadan kalkıyor!
self
Yöntemin içinde herhangi bir yere referans veriyor musunuz ? (Soru gerçekten "PyCharm tasarımcıları bunu neden bu şekilde tasarladılarsa ... Onlara sormanız gerekecek, SO değil ...)