2009-12-07 6 views
56

मैं एक कक्षा में एक और तरीका फोन करने के लिए नियमित रूप से तरीकों है, तो मैं इसअजगर स्थिर तरीकों - कैसे एक और तरीका से एक विधि कॉल करने के

class test: 
    def __init__(self): 
     pass 
    def dosomething(self): 
     print "do something" 
     self.dosomethingelse() 
    def dosomethingelse(self): 
     print "do something else" 

क्या करना है लेकिन जब मैं स्थिर तरीकों मैं नहीं कर सकता

self.dosomethingelse() 

क्योंकि कोई उदाहरण नहीं है। मुझे एक ही कक्षा के किसी अन्य स्थिर विधि से स्थिर विधि को कॉल करने के लिए पायथन में कैसे करना है?

संपादित करें: क्या गड़बड़ है। ठीक है, मैंने सवाल को मूल प्रश्न पर वापस संपादित किया। मेरे पास पहले से ही दूसरे प्रश्न का उत्तर है जो पीटर हैंनसेन की टिप्पणी में है। अगर आपको लगता है कि मुझे पहले से ही एक उत्तर के लिए एक और सवाल खोलना चाहिए, तो कृपया मुझे बताएं।

+2

@pablo: आप सवाल का सार नहीं बदल सकते हैं !! इस सवाल को समाप्त करें और ** एक और ** शुरू करें !! – jldupont

+0

ठीक है, ठीक है। क्या आपका मतलब सवाल हटाना है? उत्तर पीटर हैनसेन की टिप्पणी में पहले से ही है – Pablo

+0

@ पाब्लो: आप यहां नहीं हटा सकते हैं जो आपके प्रश्न के उत्तर में योगदान देने वाले सभी के लिए विनम्र नहीं होगा। आपको एक उत्तर ** और ** एक नया प्रश्न बनाने की आवश्यकता है। – jldupont

उत्तर

47

class.method काम करना चाहिए कि ध्यान में रखते हुए यहां आप कैसे है कि क्या करना होगा है।

class SomeClass: 
    @classmethod 
    def some_class_method(cls): 
    pass 

    @staticmethod 
    def some_static_method(): 
    pass 

SomeClass.some_class_method() 
SomeClass.some_static_method() 
+11

सलाह यहां शामिल की जानी चाहिए: यह स्पष्ट है कि कक्षाओं के तरीकों पर staticmethods पर कोई कमी नहीं है, और क्लासमेड्स भविष्य में अन्य वर्ग विधियों को कॉल करने के लिए विधि को विस्तारित करने की अनुमति देता है। इस प्रकार इसे हमेशा प्राथमिकता दी जानी चाहिए, भले ही तत्काल आवश्यकता न हो। – u0b34a0f6ae

+0

** नोट ** @ पाब्लो ** ** ** प्रश्न बदल गया !!!!! – jldupont

+1

@ u0b34a0f6ae: मुझे नहीं पता कि मैं कुछ अच्छा कर रहा हूं या नहीं ... लेकिन मैंने एक कक्षा के अंदर सजावटी को परिभाषित किया। सजावटी को "staticmethod" होना चाहिए, न कि "classmethod"। –

8

नोट - ऐसा लगता है कि प्रश्न कुछ बदल गया है। एक स्थिर विधि से आप एक उदाहरण विधि को कैसे कॉल करते हैं, इस सवाल का जवाब यह है कि आप एक तर्क के रूप में एक उदाहरण को पारित किए बिना या स्थिर विधि के अंदर उस उदाहरण को तत्काल नहीं कर सकते हैं।

याद रखिए कि वहाँ स्थिर तरीकों और अजगर में वर्ग तरीकों के बीच एक अंतर है:

क्या इस प्रकार का जवाब देने के "कैसे आप एक और स्थिर विधि से एक स्थिर विधि कहते हैं" ज्यादातर है। एक स्थैतिक विधि कोई अंतर्निहित पहला तर्क नहीं लेती है, जबकि एक वर्ग विधि वर्ग को पहले तर्क के रूप में लेती है (आमतौर पर cls सम्मेलन द्वारा)।

यदि यह एक स्थिर विधि है:

test.dosomethingelse() 

यह एक वर्ग विधि बताया गया है:

cls.dosomethingelse() 
+1

आप कक्षा परिभाषा के भीतर से केवल 'cls.dosomethingelse() 'का उपयोग कर सकते हैं। – jldupont

+1

अधिक सटीक होने के लिए, आप केवल कक्षा विधि के भीतर से 'cls.dosomethingelse() 'का उपयोग कर सकते हैं। जैसे आप केवल एक उदाहरण विधि के भीतर से 'स्वयं' का उपयोग कर सकते हैं। –

+1

क्षमा करें, मैंने गलत सवाल लिखा है। ओह !. मैं लिखना चाहता था "मुझे एक ही कक्षा के किसी अन्य स्थैतिक विधि से इंस्टेंस विधि को कॉल करने के लिए पायथन में कैसे करना है" और नहीं "मुझे एक अन्य विधिवत विधि से स्थैतिक विधि को कॉल करने के लिए पायथन में कैसे करना है कक्षा " – Pablo

2

आप नहीं कर सकते फोन स्थिर तरीकों से गैर स्थिर तरीकों लेकिन स्थिर विधि के अंदर उदाहरण बनाकर .... द्वारा यह है कि

class test2(object): 
    def __init__(self): 
     pass 

    @staticmethod 
    def dosomething(): 
     print "do something" 
     #creating an instance to be able to call dosomethingelse(),or you may use any existing instace 
     a=test2() 
     a.dosomethingelse() 

    def dosomethingelse(self): 
     print "do something else" 

test2.dosomething() 

आशा आप में मदद मिलेगी की तरह काम करना चाहिए :)

+1

आईएमओ यह दृष्टिकोण आपकी विधियों की घोषणा करने के लिए '@ classmethod' का उपयोग करने और' cls.dosomethingelse() '' cls.dosomethingelse() 'के भीतर 'प्रदर्शन' के संदर्भ में बदतर है - दोनों प्रदर्शनों के संदर्भ में बदतर (केवल वस्तुओं को तुरंत प्राप्त करने के लिए एक स्थिर विधि तक पहुंच) और पठनीयता (यह सीधा नहीं है, और मुझे कल्पना है कि अगर इस प्रकार का पैटर्न बॉयलरप्लेट बन गया है, तो पूरे कोडबेस केवल मानव के लिए पार्स के लिए काफी मुश्किल हो सकता है) –

+0

जैसा कि मैंने एसओ पर कहीं और पढ़ा है, प्रारंभ करने की बजाय उदाहरण को सीधे एक विधि कॉल करने के लिए, आप इसे केवल कॉल कर सकते हैं - यह स्वयं को स्वयं ही संक्रमित कर देगा। – Nakilon

3

ठीक क्लास विधियों और स्थिर विधियों के बीच मुख्य डिफिरेंस है: कक्षा विधि की अपनी पहचान है, इसलिए उन्हें एक इंस्टॉलेशन के भीतर से क्यों बुलाया जाना चाहिए। दूसरी ओर स्थिर पद्धति पर एक ही कक्षा की एक और स्थिर विधि से एक स्थिर विधि फोन करने के लिए एक से अधिक इंस्टेंस के बीच साझा किया जा सकता है ताकि यह वर्ग

69

मैं कैसे पायथन में मुझे क्या करना होगा के भीतर से बुलाया जाना चाहिए ?

class Test() : 
    @staticmethod 
    def static_method_to_call() 
     pass 

    @staticmethod 
    def another_static_method() : 
     Test.static_method_to_call() 

    @classmethod 
    def another_class_method(cls) : 
     cls.static_method_to_call() 
0

इन तो वर्ग या उदाहरण पर निर्भर नहीं है यही कारण है कि सिर्फ उन्हें एक समारोह नहीं? क्योंकि यह स्पष्ट समाधान की तरह प्रतीत होता है। बेशक आप सोचते हैं कि इसे ओवरराइट, सबक्लास इत्यादि की आवश्यकता होगी। यदि ऐसा है तो पिछले जवाब सबसे अच्छे शर्त हैं। फिंगर्स पार हो गए हैं, मैं केवल एक वैकल्पिक समाधान की पेशकश करने के लिए चिह्नित नहीं हूं जो किसी की जरूरतों को पूरा कर सकता है या नहीं;)।

सही जवाब सवाल में कोड का उपयोग के मामले पर निर्भर करेगा के रूप में;) आनंद लें

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