पायथन में @staticmethod और @classmethod के बीच अंतर को समझना

Python

पायथन मेथड डेकोरेटर्स में मुख्य अंतर

पायथन में, प्रभावी ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए @staticmethod और @classmethod के बीच की बारीकियों को समझना महत्वपूर्ण है। इन डेकोरेटर्स का उपयोग एक वर्ग के भीतर तरीकों को परिभाषित करने के लिए किया जाता है, लेकिन वे अलग-अलग उद्देश्यों की पूर्ति करते हैं और अलग-अलग व्यवहार करते हैं।

हालाँकि दोनों को बिना कोई उदाहरण बनाए कक्षा में बुलाया जा सकता है, लेकिन जिस तरह से वे अपने तर्कों को संभालते हैं और उनका उपयोग करने का इरादा काफी भिन्न होता है। यह आलेख प्रत्येक डेकोरेटर का उपयोग कब करना है, यह स्पष्ट करने के लिए स्पष्ट उदाहरण प्रदान करते हुए, अंतरों पर प्रकाश डालता है।

आज्ञा विवरण
@staticmethod एक ऐसी विधि को परिभाषित करता है जो क्लास स्थिति तक पहुंच या संशोधन नहीं करती है। इसे कक्षा में ही बुलाया जाता है, उदाहरणों पर नहीं।
@classmethod एक विधि को परिभाषित करता है जो वर्ग को पहले तर्क के रूप में प्राप्त करता है। इसका उपयोग फ़ैक्टरी विधियों या विधियों के लिए किया जाता है जिन्हें क्लास स्थिति को संशोधित करने की आवश्यकता होती है।
cls क्लास को क्लास विधि में प्रस्तुत करता है, क्लास विशेषताओं और अन्य क्लास विधियों तक पहुंच की अनुमति देता है।
from_sum(cls, arg1, arg2) एक क्लास विधि जो @classmethod के उपयोग को प्रदर्शित करते हुए क्लास का एक उदाहरण लौटाती है।
print() कंसोल पर परिणाम या मान को आउटपुट करता है, जो तरीकों के परिणाम को प्रदर्शित करने के लिए उपयोगी है।
self.value क्लास विधि द्वारा बनाए गए इंस्टेंस के लिए विशिष्ट डेटा को संग्रहीत करने के लिए इंस्टेंस विशेषता का उपयोग किया जाता है।
return cls(arg1 + arg2) दिए गए तर्कों के योग के साथ कक्षा का एक नया उदाहरण बनाता है और लौटाता है।

@staticmethod और @classmethod की भूमिका को समझना

पहली स्क्रिप्ट के उपयोग को दर्शाती है पायथन में. ए एक विधि है जो एक वर्ग से संबंधित है लेकिन वर्ग की स्थिति तक पहुंच या संशोधन नहीं करती है। इसका मतलब यह है कि यह इंस्टेंस वेरिएबल्स या क्लास वेरिएबल्स तक नहीं पहुंच सकता है। इसके बजाय, यह एक नियमित फ़ंक्शन की तरह व्यवहार करता है जो क्लास के नेमस्पेस से संबंधित है। उदाहरण में, दो तर्क लेता है और उनका योग लौटाता है। इसे सीधे कक्षा में बुलाया जाता है MyClass कक्षा का एक उदाहरण बनाने की आवश्यकता के बिना। यह उपयोगिता विधियों के लिए विशेष रूप से उपयोगी है जो वर्ग की स्थिति से अलग कार्य करते हैं।

दूसरी लिपि इसके उपयोग को दर्शाती है . भिन्न , ए वर्ग को पहले तर्क के रूप में ही प्राप्त करता है, जिसे आम तौर पर नामित किया जाता है cls. यह विधि को वर्ग-स्तरीय विशेषताओं तक पहुँचने और संशोधित करने की अनुमति देता है। उदाहरण में, विधि दो तर्क लेती है, उन्हें एक साथ जोड़ती है, और एक नया उदाहरण लौटाती है इसके योग के साथ गुण। इस पैटर्न का उपयोग अक्सर फ़ैक्टरी विधियों के लिए किया जाता है जो विभिन्न तरीकों से उदाहरण बनाते हैं। का उपयोग करके cls, विधि यह सुनिश्चित करती है कि कक्षा उपवर्गित होने पर भी यह सही ढंग से काम करती है।

पायथन में @staticmethod और @classmethod के बीच अंतर

पायथन प्रोग्रामिंग उदाहरण: @staticmethod का उपयोग करना

class MyClass:
    @staticmethod
    def static_method(arg1, arg2):
        return arg1 + arg2

# Calling the static method
result = MyClass.static_method(5, 10)
print(f"Result of static method: {result}")

पायथन में @classmethod की खोज

पायथन प्रोग्रामिंग उदाहरण: @classmethod का उपयोग करना

class MyClass:
    def __init__(self, value):
        self.value = value

    @classmethod
    def from_sum(cls, arg1, arg2):
        return cls(arg1 + arg2)

# Creating an instance using the class method
obj = MyClass.from_sum(5, 10)
print(f"Value from class method: {obj.value}")

पायथन में मेथड डेकोरेटर्स की विस्तृत खोज

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

दूसरी ओर, ए जब आपको फ़ैक्टरी विधियाँ बनाने या क्लास स्थिति को बदलने की आवश्यकता होती है तो यह अमूल्य है। फ़ैक्टरी विधियाँ ऑब्जेक्ट बनाने के तरीके पर अधिक नियंत्रण प्रदान कर सकती हैं, जो सिंगलटन जैसे डिज़ाइन पैटर्न को लागू करने में विशेष रूप से उपयोगी हो सकती हैं, जहाँ आपको यह सुनिश्चित करने की आवश्यकता होती है कि एक वर्ग का केवल एक उदाहरण बनाया गया है। आगे, इनपुट मापदंडों के आधार पर विभिन्न उपवर्गों के उदाहरण लौटाने वाली विधियाँ बनाकर बहुरूपता को लागू करने के लिए उपयोग किया जा सकता है। वर्ग स्थिति और व्यवहार को संशोधित करने की यह क्षमता वर्ग विधियों को उन्नत ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में एक शक्तिशाली उपकरण बनाती है, जो अधिक लचीली और पुन: प्रयोज्य कोड संरचनाओं की अनुमति देती है।

  1. क्या है एक ?
  2. ए एक ऐसी विधि है जो क्लास स्थिति तक पहुंच या संशोधन नहीं करती है और इसे बिना किसी उदाहरण के क्लास पर बुलाया जा सकता है।
  3. क्या है एक ?
  4. ए एक ऐसी विधि है जो क्लास को उसके पहले तर्क के रूप में प्राप्त करती है, जो उसे क्लास स्थिति को संशोधित करने या क्लास के उदाहरण बनाने की अनुमति देती है।
  5. आपको a का उपयोग कब करना चाहिए? ?
  6. का उपयोग करो उपयोगिता कार्यों के लिए जो तार्किक रूप से एक वर्ग से संबंधित हैं लेकिन उन्हें वर्ग या उदाहरण डेटा तक पहुंच की आवश्यकता नहीं है।
  7. आपको a का उपयोग कब करना चाहिए ?
  8. का उपयोग करो फ़ैक्टरी विधियों या विधियों के लिए जिन्हें वर्ग स्थिति को संशोधित करने की आवश्यकता होती है।
  9. कर सकना वर्ग विशेषताओं तक पहुंचें?
  10. नहीं, ए वर्ग विशेषताओं तक पहुँच या संशोधन नहीं कर सकता।
  11. कर सकना वर्ग विशेषताओं तक पहुंचें?
  12. हाँ एक वर्ग विशेषताओं तक पहुंच और संशोधन कर सकते हैं।
  13. आप कैसे कॉल करते हैं? ?
  14. आप कॉल करें ए वर्ग नाम का उपयोग करना, जैसे .
  15. आप कैसे कॉल करते हैं? ?
  16. आप कॉल करें ए वर्ग नाम का उपयोग करना, जैसे , और यह वर्ग को पहले तर्क के रूप में प्राप्त करता है।
  17. कर सकना इंस्टेंस डेटा संशोधित करें?
  18. नहीं, ए इंस्टेंस डेटा को संशोधित नहीं किया जा सकता क्योंकि उसे इंस्टेंस का कोई संदर्भ प्राप्त नहीं होता है।
  19. कर सकना उपवर्गों द्वारा ओवरराइड किया जाएगा?
  20. हाँ एक विशिष्ट व्यवहार प्रदान करने के लिए उपवर्गों द्वारा ओवरराइड किया जा सकता है।

निष्कर्षतः, दोनों और पायथन कोड की संरचना के लिए विशिष्ट लाभ प्रदान करते हैं। जबकि स्थैतिक विधियाँ उपयोगिता कार्यों के लिए आदर्श होती हैं जिन्हें वर्ग या उदाहरण-विशिष्ट डेटा तक पहुँच की आवश्यकता नहीं होती है, वर्ग विधियाँ फ़ैक्टरी विधियों और वर्ग-स्तरीय विशेषताओं को संशोधित करने के लिए शक्तिशाली होती हैं। प्रत्येक डेकोरेटर के लिए अंतर और उचित उपयोग के मामलों को पहचानने से ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में कोड स्पष्टता, रखरखाव और समग्र डिजाइन में काफी वृद्धि हो सकती है।