स्टेटिक तरीके - किसी अन्य विधि से एक विधि को कैसे कॉल करें?


96

जब मेरे पास एक कक्षा में दूसरी विधि को कॉल करने के लिए नियमित तरीके हैं, तो मुझे यह करना होगा

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

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

self.dosomethingelse()

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

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


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

ठीक है ठीक है। क्या आपका मतलब है कि प्रश्न को हटा दें? इसका उत्तर पहले से ही पीटर हेन्सन की टिप्पणी में है
पाब्लो

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

1
@ पाब्लो: और बस स्पष्ट होना: आपके मूल प्रश्न निर्माण के लिए एक उत्तर स्वीकार किया जाना चाहिए । चिंता न करें, आप यहां अपना रास्ता सीखेंगे। चीयर्स :-)
जूलुपोंट

जवाबों:


79

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()

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

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

@ u0b34a0f6ae क्या classmethods हमेशा थ्रेड सुरक्षित होते हैं? मेरे उपयोग के मामले में, मैं थ्रेड में स्थिर पहुंच का उपयोग कर रहा हूं ताकि उस वर्ग तक आकस्मिक पहुंच को रोका जा सके जो थ्रेड सुरक्षित नहीं हो सकता है।
अक्विविटे

@ u0b34a0f6ae हमेशा थोड़ा मजबूत होता है। उदाहरण के लिए PySpark staticmethods का उपयोग rdd नौकरियों में किया जा सकता है और classmethods नहीं कर सकते।
लॉरेन्स कोपेनोल

136

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

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()

कॉल Test.static_method_to_call()इस वर्ग के अन्य गैर-स्थिर और गैर-क्लास तरीकों से काम करना चाहिए, ठीक है? ... (और शायद अन्य कक्षाएं भी?)
gr4nt3d

हां, Test.static_method_to_call()कहीं से भी काम करेंगे।
वार्वारियुक

11

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

इस बात का उत्तर देने के लिए कि "आप किसी अन्य स्थैतिक विधि से किसी स्थैतिक विधि को कैसे कॉल करते हैं":

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

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

test.dosomethingelse()

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

cls.dosomethingelse()

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

3
अधिक सटीक होने के लिए, आप केवल cls.dosomethingelse()कक्षा पद्धति के भीतर से ही उपयोग कर सकते हैं । जैसे आप केवल selfएक इंस्टेंस मेथड से ही इस्तेमाल कर सकते हैं ।
जेसन बेकर

1
क्षमा करें, मैंने प्रश्न गलत लिखा है। ओह !. मैं लिखना चाहता था "मुझे उसी कक्षा की किसी अन्य स्थिर विधि से आवृत्ति विधि के लिए पायथन में कैसे करना है" और नहीं "मुझे उसी की एक अन्य स्थिर विधि से एक स्थिर विधि को कॉल करने के लिए पायथन में कैसे करना है" कक्षा "
पाब्लो

@ पाब्लो: इस मामले में, आपको एक और प्रश्न लिखने और इसे समाप्त करने की आवश्यकता है।
jldupont

@jldupont, मेरे पास पहले से ही जवाब है लेकिन एक टिप्पणी में। मुझे क्या करना चाहिए क्योंकि मैं इसे स्वीकार नहीं कर सकता लेकिन यह सवाल को मिटाने के लिए एक बेकार होगा, ऐसा नहीं होगा?
पाब्लो

4

वर्ग विधियों और स्थिर विधियों के बीच मुख्य अंतर ठीक है:

  • वर्ग विधि की अपनी पहचान है, इसीलिए उन्हें एक INSTANCE के भीतर से बुलाया जाना है।
  • दूसरी ओर स्थैतिक विधि को कई उदाहरणों के बीच साझा किया जा सकता है ताकि इसे CLASS के भीतर से बुलाया जाए

0

आप स्थैतिक तरीकों से गैर-स्थैतिक तरीकों को नहीं बुला सकते हैं, लेकिन स्थैतिक विधि के अंदर एक उदाहरण बनाकर .... इसे उसी तरह काम करना चाहिए

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()

आशा है कि आपकी मदद करेंगे :)


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

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

0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.