2013-04-23 8 views
15

मुझे पता है कि वे क्या करते हैं और मैंने दोनों के कई उदाहरण देखे हैं, लेकिन मुझे एक ऐसा उदाहरण नहीं मिला है जहां मुझे के साथ बदलने के बजाय classmethod का उपयोग करना होगा।staticmethod के बजाय classmethod का उपयोग क्यों करें?

classmethod का सबसे आम उदाहरण मैंने देखा है एक नया उदाहरण वर्ग के ही बनाने के लिए है, इस तरह (बहुत सरल उदाहरण है, वहाँ विधि एटीएम का कोई फायदा नहीं है, लेकिन आप विचार मिलता है।):

class Foo: 
    @classmethod 
    def create_new(cls): 
     return cls() 

यह जब foo = Foo.create_new() बुला Foo का एक नया उदाहरण लौट आते हैं। अब कारण है कि मैं सिर्फ इस के बजाय का उपयोग नहीं कर सकते हैं:

class Foo: 
    @staticmethod 
    def create_new(): 
     return Foo() 

यह ठीक उसी, क्यों मैं कभी भी एक classmethod एक staticmethod से अधिक का उपयोग करना चाहिए है?

+7

@ केविन ब्रायनडन उस पृष्ठ पर ओपीएस प्रश्न के लिए कोई * उत्तर * नहीं है लेकिन यह वहां टिप्पणियों में हो सकता है। मुझे नहीं पता कि यह – jamylak

+1

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

उत्तर

17

आपके उदाहरण में थोड़ा अंतर है, लेकिन लगता है कि आप Foo का एक उपवर्ग बनाया है और उपवर्ग पर create_new विधि कहा जाता है ...

class Bar(Foo): 
    pass 

obj = Bar.create_new() 

... तो इस आधार वर्ग एक नया Bar वस्तु का कारण होगा बनाया जाना ...

class Foo: 
    @classmethod 
    def create_new(cls): 
     return cls() 

... जबकि इस आधार वर्ग का कारण होता है एक नया Foo वस्तु बनाया जाना ...

class Foo: 
    @staticmethod 
    def create_new(): 
     return Foo() 

... तो विकल्प निर्भर करेगा कि आप कौन सा व्यवहार चाहते हैं।

+0

सबक्लास के बारे में नहीं सोचा था, मेरे बुरे! त्वरित उत्तर के लिए धन्यवाद :) मैं Asap स्वीकार करेंगे। –

5

हां, वे दो वर्ग समान होंगे।

class Bar (Foo): 
    pass 

अब बुला Bar.create_new कुछ अलग करता है:

हालांकि, अब उस वर्ग के एक उप-प्रकार की कल्पना। स्थिर विधि के लिए, आपको Foo मिलता है। कक्षा विधि के लिए, आपको Bar मिलता है।

तो महत्वपूर्ण अंतर यह है कि एक वर्ग विधि को पैरामीटर के रूप में पारित प्रकार मिलता है।

4

docs से, एक वर्ग विधि अपनी कक्षा को एक निहित तर्क के रूप में प्राप्त करती है, जबकि स्थैतिक विधियां कक्षा के बारे में अनजान हैं, जिसमें वे रहते हैं।

यह ऐसी परिस्थितियों में उपयोगी हो सकता है जहां आपके पास विरासत में स्थिर विधि है जिसे आप उप-वर्ग में विभिन्न व्यवहार के साथ ओवरराइड करना चाहते हैं।

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