2014-05-09 7 views
69

पर विधि बदलने का प्रस्ताव करता है नया पिचर्म रिलीज (3.1.3 सामुदायिक संस्करण) उन विधियों को परिवर्तित करने का प्रस्ताव करता है जो मौजूदा ऑब्जेक्ट के राज्य के साथ स्थिर नहीं हैं। उस के लिए व्यावहारिक कारणक्यों पिचर्म स्थिर

enter image description here

क्या है? कुछ प्रकार के सूक्ष्म प्रदर्शन (-या-मेमोरी) - अनुकूलन?

+2

क्या आपने "अधिक ..." पर क्लिक किया था? क्या आप विधि के अंदर कहीं भी 'स्वयं' का संदर्भ देते हैं? (यदि सवाल वास्तव में है "क्यों PyCharm के डिजाइनरों ने इसे इस तरह डिजाइन किया ... आपको उनसे पूछना होगा, एसओ नहीं ...) – geoffspear

+3

@Wooble: विधि के एकल लाइन कार्यान्वयन के रूप में' वापसी 1' है "अधिक" में कुछ भी उपयोगी नहीं है – zerkms

उत्तर

6

मैं एक वर्ग विधि स्थिर एक के रूप में परिभाषित होने के निम्न लाभ कल्पना कर सकते हैं:

  • तुम सिर्फ वर्ग के नाम है, यह दृष्टांत करने की कोई जरूरत का उपयोग कर विधि कॉल कर सकते हैं।

शेष फायदे बिल्कुल शायद अगर सीमांत मौजूद हैं:

  • थोड़ा तेजी से चला सकता है
  • स्मृति का एक सा
+0

हाँ। लेकिन बात यह है कि - मैं इसे एक स्थिर विधि के रूप में उपयोग नहीं कर रहा हूं। अन्यथा यह पहले से ही स्थैतिक होगा। इसलिए PyCharm इसे किसी भी अच्छे कारण (?) के साथ करने की सलाह देता है। "शेष फायदे शायद सीमांत हैं यदि मौजूद हैं" --- हाँ, बिल्कुल।लेकिन अगर ऐसा है - यह PyCharm – zerkms

+0

@zerkms से मूर्खतापूर्ण सलाह है, यह इस तरह के कुछ आकर्षक उदाहरणों के साथ चला जाता है :-) –

+0

स्टेटिक विधियां अच्छे सॉफ्टवेयर बनाने के लिए एक दुश्मन हैं। वे कई सिद्धांतों को रद्द करते हैं, इसलिए 'बिट' तेजी से चल रहा है, यह बिंदु नहीं है (कारण वे रैम में चलते हैं ताकि दोनों मामलों में तेज़ हो) और जैसा कि आप जानते हैं कि कंप्यूटर में अब स्मृति की 'गुच्छा' है, इसलिए अब कोई समस्या नहीं है। अपने पहले विचार को भी ध्यान दें: यह एक प्रक्रियात्मक व्यवहार है जो ऑब्जेक्ट उन्मुख नहीं है। – TechJS

81

PyCharm "सोचता है कि" बचाने आप हो सकता है एक स्थिर विधि रखने के लिए चाहता था, लेकिन आप इसे स्थिर होने की घोषणा करना भूल गए।

PyCharm इस वजह विधि करता है प्रस्ताव नहीं उपयोग अपने शरीर मेंself और इसलिए नहीं करता है वास्तव में परिवर्तन वर्ग उदाहरण। इसलिए विधि स्थैतिक हो सकती है, यानी पहले एक क्लास उदाहरण बनाने के बिना कॉल करने योग्य।

+2

इतने सारे लोगों ने इस स्वाद प्रतिक्रिया के साथ उत्तर दिया है। हालांकि, यदि आप जानते हैं कि यह निश्चित रूप से एक स्थैतिक विधि नहीं होने वाला है, तो उसे "फेंक नं। कार्यान्वित त्रुटि" शामिल करें, जबकि आप निश्चित हैं कि आप इसे पूरा किए बिना इसका उपयोग नहीं करते हैं। –

+0

ऐसे मामले हो सकते हैं जहां PyCharm की चेतावनी अन्यायपूर्ण है कि हम न तो एक स्थिर विधि चाहते हैं और न ही राज्य को बदलना चाहते हैं। दूसरी तरफ, यदि विधि अभी तक लागू नहीं की गई है, तो 'NotImplementedError' को बढ़ाने के लिए हमेशा एक अच्छा विचार लगता है। – jolvi

3

यह त्रुटि संदेश सिर्फ मुझे, एक गुच्छा मदद की के रूप में मुझे एहसास हुआ कि नहीं था कि मैं गलती से सही तरीका

self.attributes[item] 
3
की मेरी परीक्षण उदाहरण प्लेयर का उपयोग कर

my_player.attributes[item] 

बजाय मेरी समारोह लिखा था

चूंकि आपने bar विधि निकाय में self का उल्लेख नहीं किया है, इसलिए PyCharm पूछ रहा है कि क्या आप bar स्थिर बनाना चाहते हैं। जावा जैसी अन्य प्रोग्रामिंग भाषाओं में, स्थैतिक विधि घोषित करने के स्पष्ट कारण हैं। पायथन में, एक स्थिर विधि (एएफआईके) का एकमात्र वास्तविक लाभ वर्ग के उदाहरण के बिना इसे कॉल करने में सक्षम है। हालांकि, अगर यह आपका एकमात्र कारण है, तो संभव है कि आप शीर्ष-स्तरीय फ़ंक्शन के साथ जाने से बेहतर हो - जैसे here नोट करें।

संक्षेप में, मैं एक सौ प्रतिशत निश्चित नहीं हूं कि यह क्यों है। मुझे लगता है कि वे शायद इसे आगामी रिलीज में हटा देंगे।

13

@jolvi, @ArundasR, और अन्य के साथ सहमत, चेतावनी एक सदस्य समारोह पर होती है जो self का उपयोग नहीं करती है।

क्या आप वाकई PyCharm गलत है, कि समारोह एक @staticmethod नहीं होना चाहिए, और यदि आप शून्य चेतावनी महत्व देते हैं, तो आप इस एक दूर दो अलग अलग तरीकों जाना कर सकते हैं कर रहे हैं:

वर्कअराउंड # 1

def bar(self): 
    self.is_not_used() 
    doing_something_without_self() 

def is_not_used(self): 
    pass 

वर्कअराउंड # 2[धन्यवाद @DavidPärsson]

# noinspection PyMethodMayBeStatic 
def bar(self): 
    doing_something_without_self() 

मेरे लिए यह एप्लिकेशन था (कारण मैं @staticmethod का उपयोग नहीं कर सका) प्रोटोकॉल उपप्रकार फ़ील्ड का जवाब देने के लिए हैंडलर फ़ंक्शंस की एक तालिका बनाने में था। सभी हैंडलर को पाठ्यक्रम का एक ही रूप होना चाहिए (स्थिर या nonstatic)। लेकिन कुछ उदाहरण के साथ कुछ भी नहीं किया था। अगर मैंने उन स्थिरों को बनाया है तो मुझे "TypeError: 'staticmethod' ऑब्जेक्ट कॉल करने योग्य नहीं होगा"।

ओपी के कर्कश के समर्थन में, सुझाव देते हुए कि आप जब भी कर सकते हैं staticmethod जोड़ते हैं, तो principle के खिलाफ चला जाता है कि इसे और अधिक बनाने के लिए कोड को कम प्रतिबंधित करना आसान है - एक विधि स्थैतिक इसे अब कम प्रतिबंधित बनाता है, उसमें आप example.f() के बजाय class.f() को कॉल कर सकते हैं।

अनुमान क्यों इस चेतावनी मौजूद है के रूप में:

  • यह advertises staticmethod। यह डेवलपर्स को उस चीज़ के बारे में जागरूक करता है जिसका वे इरादा कर सकते हैं।
  • @ जॉनवॉरल के अंक के रूप में, यह आपका ध्यान प्राप्त करता है जब स्वयं अनजाने में फ़ंक्शन के को छोड़ दिया गया था।
  • ऑब्जेक्ट मॉडल पर पुनर्विचार करने के लिए यह एक क्यू है; शायद इस वर्ग में फ़ंक्शन से संबंधित नहीं है।
+0

"एक विधि स्थैतिक बनाना अब इसे कम प्रतिबंधित बनाता है" --- यह बिलकुल नहीं है। उदाहरण: पॉलिमॉर्फिक विधियों – zerkms

+0

मुझे लगता है कि अंतिम बिंदु दोहराता है: "आप इसे एक विधि क्यों बनाते हैं, जब यह स्पष्ट रूप से एक कार्य होता है?" उन सामानों को रखें जिन्हें वास्तव में कुछ पहलू से संबंधित संरचनात्मक सामग्री से अलग एक उदाहरण की आवश्यकता होती है। फिर आप इसे आसानी से अलग मॉड्यूल में विभाजित कर सकते हैं। – dhill

+0

@dhill नियम उस दिन तक सुंदर चीजें हैं जब तक आप एक उचित अपवाद नहीं सोचते। मैंने कॉलबैक की एक सूची का वर्णन किया। –

2

मैं यहां दिए गए उत्तरों से सहमत हूं (विधि self का उपयोग नहीं करती है और इसलिए @staticmethod के साथ सजाया जा सकता है)।

मैं यह जोड़ना चाहता हूं कि आप कक्षा के अंदर एक स्थिर विधि के बजाय विधि को शीर्ष-स्तरीय फ़ंक्शन पर ले जाना चाहते हैं। विवरण के लिए इस प्रश्न और स्वीकृत उत्तर देखें: python - should I use static methods or top-level functions

विधि को शीर्ष-स्तरीय फ़ंक्शन में ले जाने से PyCharm चेतावनी भी ठीक हो जाएगी।

4

मुझे लगता है कि इस चेतावनी का कारण पिचर्म में कॉन्फ़िगर है। आप चयन को अनचेक कर सकते हैं विधि में स्थिर हो सकता है-> निरीक्षण

+4

मेरा सवाल यह था कि ऐसा निरीक्षण क्यों मौजूद है। मैं समझता हूं कि मैं इसे बंद कर सकता हूं। क्षमा करें, एक जवाब नहीं। – zerkms

संबंधित मुद्दे