मुख्य सामग्री पर जाएँ

Python में प्राइवेट मेथड्स समझें

Python में प्राइवेट मेथड्स, उनका सिंटैक्स, उन्हें अपने प्रोजेक्ट्स में उदाहरणों के साथ कब और कैसे इस्तेमाल करें, तथा सर्वोत्तम प्रथाएँ जानें।
· 9 मि॰ पढ़ें

AI के साथ खोजें

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP), जो एक सॉफ्टवेयर डिज़ाइन पद्धति है, में हम वास्तविक दुनिया की संस्थाओं को मॉडल करने के लिए “ऑब्जेक्ट्स” का उपयोग करते हैं। एक ऑब्जेक्ट एक डाटा स्ट्रक्चर होता है, जिसमें गुण (डेटा) और मेथड्स (फंक्शन्स) होते हैं जो उस डेटा पर कार्य करते हैं। जटिल सिस्टम्स को ऑब्जेक्ट्स के साथ डिज़ाइन करना आसान हो सकता है।

OOP के मूल सिद्धांतों और सॉफ्टवेयर इंजीनियरिंग से जुड़े कॉन्सेप्ट्स के बारे में अधिक जानने के लिए हमारा Python के साथ ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग कोर्स शुरू करें।

एन्कैप्सुलेशन OOP का एक मौलिक कॉन्सेप्ट है। इसका अर्थ है किसी ऑब्जेक्ट के डेटा और मेथड्स को एक साथ समेटना और उनके विवरणों को बाहरी दुनिया से छिपाना। एन्कैप्सुलेशन को एक ऐसी प्रक्रिया के रूप में सोचें जो एक ‘कैप्सूल’ (ऑब्जेक्ट) बनाती है, जिसमें अपना डेटा और उसे नियंत्रित करने के अपने तरीके होते हैं।

एन्कैप्सुलेशन का मुख्य उद्देश्य है:

  • डेटा तक सीधे पहुँच को रोकना (डेटा इंटेग्रिटी)।
  • केवल आवश्यक चीज़ें दिखाकर सिस्टम को सरल बनाना (एब्स्ट्रैक्शन)।

किसी क्लास के आंतरिक इम्प्लीमेंटेशन विवरणों को छिपाकर यह एन्कैप्सुलेशन हासिल करने में प्राइवेट मेथड्स अहम भूमिका निभाते हैं।

किसी मेथड को प्राइवेट बनाकर, आप अन्य प्रोग्रामर्स को बताते हैं कि इस मेथड को सीधे एक्सेस करने का इरादा नहीं है। इससे यह सुनिश्चित कर बग्स और त्रुटियों को रोका जा सकता है कि किसी ऑब्जेक्ट की आंतरिक स्थिति केवल नियंत्रित तरीकों से ही बदली जाए।

यहाँ, हम प्राइवेट मेथड्स का परिचय देंगे, उन्हें परिभाषित करने का सिंटैक्स, वास्तविक उदाहरणों में उनका उपयोग, और उनसे जुड़ी सर्वोत्तम प्रथाएँ देखेंगे।

प्राइवेट मेथड्स क्या हैं?

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) में प्राइवेट मेथड्स वे फंक्शन्स हैं जो किसी क्लास के भीतर केवल आंतरिक उपयोग के लिए बनाए जाते हैं। ये किसी क्लास की कार्यक्षमता को एन्कैप्सुलेट करते हैं, ताकि उसकी आंतरिक कार्यप्रणाली बाहरी इंटरैक्शन से संरक्षित रहे।

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

Python में प्राइवेट मेथड्स को दर्शाने की परंपरा यह है कि मेथड के नाम के पहले एक सिंगल अंडरस्कोर (_) या डबल अंडरस्कोर (__) लगाया जाता है। यह डेवलपर्स को मेथड के अपेक्षित स्कोप के बारे में संकेत देता है और यह मात्र एक परंपरा है।

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

प्राइवेट मेथड्स का सिंटैक्स

प्राइवेट मेथड्स को परिभाषित करने के दो तरीके हैं, जिन्हें हम उदाहरणों के माध्यम से देखेंगे।

हम किसी फ़ंक्शन नाम के पहले सिंगल अंडरस्कोर लगाकर प्राइवेट मेथड परिभाषित कर सकते हैं:

class MyClass:
   def _private_method(self):
       print("This is a private method")

यह परिभाषा केवल प्रोग्रामर्स के लिए एक परंपरा है क्योंकि यह फ़ंक्शन क्लास के बाहर से भी एक्सेस किया जा सकता है, हालाँकि ऐसा करना अनुशंसित नहीं है।

यदि आपने पहली बार Python में क्लासेज़ के बारे में सुना है, तो हम सलाह देंगे कि पहले हमारा शुरुआती-अनुकूल क्लासेज़ पर ट्यूटोरियल देखें।

आइए एक ऑब्जेक्ट बनाते हैं और बनाए गए प्राइवेट मेथड को एक्सेस करने की कोशिश करते हैं:

# Creating an object
obj = MyClass()

# Accessing from outside
obj._private_method()  # Not recommended to call directly, but possible

Python में डबल अंडरस्कोर का उपयोग करके प्राइवेट मेथड्स परिभाषित करने का एक और सिंटैक्स है। यह ऐसा दिखता है:

class MyClass:
   def __private_method(self):
       print("This is a private method")

obj = MyClass()
# obj.__private_method()  # This will raise an AttributeError

जब हम क्लास के बाहर से प्राइवेट मेथड को एक्सेस करने की कोशिश करते हैं, तो यह AttributeError फेंकता है, जो संकेत देता है कि इसे सीधे फ़ंक्शन नाम का उपयोग कर एक्सेस नहीं किया जा सकता।

Python में प्राइवेट मेथड्स के सिंटैक्स का संक्षेप:

  • सिंगल अंडरस्कोर: मात्र प्रोग्रामर्स के लिए परंपरा, फिर भी फ़ंक्शन के बाहर से एक्सेस किया जा सकता है।
  • डबल अंडरस्कोर: केवल फ़ंक्शन नाम से बाहर से एक्सेस नहीं किया जा सकता। फिर भी इसे “नेम मैंगलिंग” के जरिए एक्सेस किया जा सकता है, जिसे हम आगे इस ट्यूटोरियल में देखेंगे।

Python में प्राइवेट मेथड्स का इम्प्लीमेंटेशन

एक वास्तविक उदाहरण के तौर पर, किसी उपयोगकर्ता के वित्तीय लेनदेन को प्रबंधित करने के लिए एक सुरक्षित और उपयोगकर्ता-अनुकूल BankAccount क्लास पर विचार करें। बैंक अकाउंट्स की आवश्यकताएँ हैं:

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

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

आइए इस समाधान को इम्प्लीमेंट करते हैं और कोड को समझते हैं।

class BankAccount:
   def __init__(self, account_holder, initial_balance=0):
       self.account_holder = account_holder
       self.__balance = initial_balance  # Private attribute

   def deposit(self, amount):
       if amount > 0:
           self.__balance += amount
           print(f"Deposited ${amount}. New balance: ${self.__balance}")
       else:
           print("Deposit amount must be positive.")

   def withdraw(self, amount):
       if 0 < amount <= self.__balance:
           self.__balance -= amount
           print(f"Withdrew ${amount}. New balance: ${self.__balance}")
       else:
           print("Insufficient funds or invalid amount.")

   def __update_balance(self, amount):  # Private method
       self.__balance += amount

   def transfer(self, amount, other_account):
       if 0 < amount <= self.__balance:
           self.withdraw(amount)
           other_account.__update_balance(amount)
           print(f"Transferred ${amount} to {other_account.account_holder}.")
       else:
           print("Insufficient funds or invalid amount.")

हम पहले एक BankAccountclass बनाते हैं, जो BankAccount ऑब्जेक्ट के लिए आवश्यक सभी वांछित बिहेवियर और कार्यक्षमता को समेटता है।

BankAccount क्लास में एक प्राइवेट एट्रिब्यूट __balance और एक प्राइवेट मेथड __update_balance है:

  • प्राइवेट वेरिएबल (__balance): यह BankAccount क्लास का वह एट्रिब्यूट है जो मौजूदा अकाउंट बैलेंस को संग्रहीत करता है। इसके नाम से पहले दो अंडरस्कोर (__) लगाकर इसे प्राइवेट चिह्नित किया गया है। इसका आशय है कि इसे केवल क्लास के भीतर से ही एक्सेस किया जाए। उदाहरण के लिए, इसे deposit, withdraw, और __update_balance मेथड्स द्वारा संशोधित किया जाता है। इस एट्रिब्यूट का बाहरी एक्सेस अनुशंसित नहीं है।
  • प्राइवेट मेथड (__update_balance): इस मेथड का उद्देश्य अकाउंट बैलेंस को अपडेट करना है। इसे transfer मेथड द्वारा ट्रांसफर ऑपरेशन के दौरान प्राप्तकर्ता अकाउंट का बैलेंस अपडेट करने के लिए बुलाया जाता है। यहाँ प्राइवेट मेथड का उपयोग बैलेंस अपडेट की लॉजिक को एन्कैप्सुलेट करने में मदद करता है, ताकि यह केवल क्लास द्वारा परिभाषित नियंत्रित तरीकों से ही हो।

निःसंकोच एक नया Python फ़ाइल बनाएँ, ऊपर और नीचे दिया गया कोड कॉपी-पेस्ट करें, और स्वयं चलाकर देखें।

# Using the Bank Account Solution
account1 = BankAccount("John Doe", 1000)
account2 = BankAccount("Jane Doe", 500)

account1.deposit(200)
account1.withdraw(100)
account1.transfer(300, account2)

आपको नीचे जैसा आउटपुट दिखाई देगा:

Deposited $200. New balance: $1200
Withdrew $100. New balance: $1100
Withdrew $300. New balance: $800
Transferred $300 to Jane Doe.

बधाई ! आपने प्राइवेट मेथड का उपयोग करते हुए अपना BankAccount समाधान बना लिया है!

आउटपुट के आधार पर, हम देखते हैं कि डिपॉज़िट, विदड्रॉल और फंड्स ट्रांसफर जैसे सामान्य बैंकिंग ऑपरेशंस करते समय, बैंक अकाउंट का सामान्य तार्किक व्यवहार ही अनुसरण किया जाता है।

__init__ मेथड: क्या यह एक प्राइवेट मेथड है?

आपने शायद Bank Account उदाहरण में इस्तेमाल हुए __init__ मेथड पर ध्यान दिया होगा। चूँकि यह भी डबल अंडरस्कोर सिंटैक्स का उपयोग करता है, आप सोच सकते हैं कि क्या यह भी प्राइवेट मेथड है।

__init__ मेथड को उसी तरह प्राइवेट मेथड नहीं माना जाता जैसे प्राइवेसी के लिए डबल अंडरस्कोर वाले मेथड्स होते हैं।

इसके बजाय, यह Python के विशेष मेथड्स का हिस्सा है, जिन्हें अक्सर "डंडर" मेथड ("डबल अंडरस्कोर" का संक्षिप्त रूप) कहा जाता है, और इनका भाषा में विशिष्ट उद्देश्य होता है। ऐसे अन्य विशेष मेथड्स के उदाहरण हैं __str__, __repr__, और __del__।

आइए समझते हैं कि हमारे उदाहरण में इस विशेष मेथड का उपयोग कैसे हुआ:

class BankAccount:
   def __init__(self, account_holder, initial_balance=0):
       self.account_holder = account_holder
       self.__balance = initial_balance

जैसा कि हम देखते हैं, __init__ मेथड किसी क्लास का कंस्ट्रक्टर होता है। यह अपने आप तब कॉल होता है जब क्लास का एक नया इंस्टेंस बनाया जाता है, और यह ऑब्जेक्ट के एट्रिब्यूट्स को इनिशियलाइज़ करने के लिए उपयोग होता है। BankAccount क्लास के लिए, __init__ मेथड account_holder और __balance एट्रिब्यूट्स के शुरुआती मान सेट करने के लिए उपयोग किया जाता है।

उन्नत कॉन्सेप्ट: Python में नेम मैंगलिंग

पहले हमने कहा था कि Python में प्राइवेट मेथड्स मात्र एक परंपरा हैं, और अन्य प्रोग्रामिंग भाषाओं के विपरीत Python भाषा प्राइवेसी को सख्ती से लागू नहीं करती।

सही भी है, हमने देखा कि सिंगल अंडरस्कोर का उपयोग करने पर प्राइवेट मेथड्स को सीधे एक्सेस किया जा सकता है, जबकि डबल अंडरस्कोर का उपयोग करने पर एक्सेस सीमित हो जाता है।

क्यों? क्योंकि Python में “नेम मैंगलिंग” नामक एक अवधारणा है।

जब आप किसी एट्रिब्यूट के नाम के पहले डबल अंडरस्कोर लगाते हैं, तो Python स्वतः उस नाम को संशोधित कर देता है, मूल एट्रिब्यूट नाम के पहले एक सिंगल अंडरस्कोर और क्लास का नाम जोड़कर।

यह संशोधित नाम वही है जिससे एट्रिब्यूट क्लास के भीतर आंतरिक रूप से स्टोर होता है। नाम को इस तरह संशोधित करने की प्रक्रिया को नेम मैंगलिंग कहा जाता है।

नेम मैंगलिंग दो कारणों से उपयोगी है:

  • नेम कॉन्फ्लिक्ट रोकना: इनहेरिटेंस में, यदि सबक्लास अपने सुपरक्लास के किसी एट्रिब्यूट के समान नाम वाला एट्रिब्यूट परिभाषित करता है, तो दोनों में टकराव होगा। नेम मैंगलिंग यह सुनिश्चित कर इसे टालता है कि नाम प्रत्येक क्लास के लिए विशिष्ट रहें।
  • कुछ हद तक प्राइवेसी: जबकि Python में सच्चे अर्थों में प्राइवेट एट्रिब्यूट्स नहीं होते, नेम मैंगलिंग एट्रिब्यूट्स को क्लास के बाहर से कम सुलभ बनाता है, जिससे कुछ स्तर की प्राइवेसी मिलती है।

बेहतर समझ के लिए एक उदाहरण देखते हैं।

class MyClass:
   def __init__(self):
       self.__private_attribute = "I am private"

   def __private_method(self):
       print("This is a private method")

obj = MyClass()
print(obj.__private_attribute)  # This will raise an AttributeError

इस उदाहरण में, __private_attribute और __private_method नेम-मैंगल्ड हैं। आंतरिक रूप से, ये क्रमशः _MyClass__private_attribute और _MyClass__private_method के रूप में स्टोर होते हैं। क्लास के बाहर से उनके मूल नामों का उपयोग करके एक्सेस करने की कोशिश करने पर AttributeError मिलता है।

हालाँकि, आप इन्हें अपने मैंगल्ड नामों से अब भी एक्सेस कर सकते हैं:

print(obj._MyClass__private_attribute)  # This will print "I am private"
obj._MyClass__private_method()  # This will print "This is a private method"

यद्यपि नेम मैंगलिंग एट्रिब्यूट्स को कम सुलभ बनाती है, यह नोट करना महत्वपूर्ण है कि यह Python में प्राइवेसी सुनिश्चित करने का अचूक तरीका नहीं है। यह अधिकतर यह संकेत देने की परंपरा है कि कोई एट्रिब्यूट क्लास के आंतरिक उपयोग के लिए है।

प्राइवेट मेथड्स और वेरिएबल्स के उपयोग की सर्वोत्तम प्रथाएँ

प्राइवेट मेथड्स और वेरिएबल्स का प्रभावी लाभ उठाने के लिए कुछ सर्वोत्तम प्रथाओं का पालन आवश्यक है। ये प्रथाएँ सुनिश्चित करती हैं कि आपका कोड केवल कार्यात्मक ही नहीं, बल्कि स्पष्ट, मेंटेन करने योग्य और सुरक्षित भी हो।

यहाँ कुछ सर्वोत्तम प्रथाएँ दी गई हैं:

  • “प्रोटेक्टेड” एट्रिब्यूट्स के लिए सिंगल अंडरस्कोर का उपयोग करें। यदि आप संकेत देना चाहते हैं कि कोई एट्रिब्यूट या मेथड क्लास और उसकी सबक्लासेज़ के भीतर उपयोग के लिए है, बाहरी उपयोग के लिए नहीं, तो उसके पहले सिंगल अंडरस्कोर (_) लगाएँ। यह Python में एक परंपरा है जो अन्य डेवलपर्स को बताती है कि एट्रिब्यूट या मेथड "प्रोटेक्टेड" है और उसे सीधे एक्सेस नहीं करना चाहिए।
  • “प्राइवेट” एट्रिब्यूट्स के लिए डबल अंडरस्कोर का उपयोग करें। यदि आप किसी एट्रिब्यूट या मेथड को क्लास के बाहर से कम सुलभ बनाना चाहते हैं ताकि अनजाने में संशोधन या उपयोग से बचा जा सके, तो उसके पहले डबल अंडरस्कोर (__) लगाएँ। यह नेम मैंगलिंग को ट्रिगर करता है और एट्रिब्यूट/मेथड को बाहर से एक्सेस करना कठिन (पर असंभव नहीं) बना देता है।
  • आंतरिक लॉजिक के लिए प्राइवेट मेथड्स का उपयोग करें। प्राइवेट मेथड्स (सिंगल या डबल अंडरस्कोर प्रीफ़िक्स वाले) आपकी क्लास की आंतरिक लॉजिक को एन्कैप्सुलेट करने का बढ़िया तरीका हैं। उनका उपयोग उन कार्यों के लिए करें जो क्लास की इम्प्लीमेंटेशन-विशिष्ट हैं और जिन्हें क्लास के पब्लिक इंटरफेस का हिस्सा नहीं होना चाहिए।

अंततः, अपनी कोडिंग की सर्वोत्तम प्रथाओं में निरंतरता बनाए रखना महत्वपूर्ण है। नामकरण परंपराओं का पालन करें और उन्हें अपने पूरे कोडबेस में लगातार लागू करें। इससे आपका कोड अन्य डेवलपर्स और भविष्य में आपके लिए समझना और मेंटेन करना आसान हो जाता है।

निष्कर्ष

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

और सीखने के लिए, आप Python Programming Skill Track और Object-oriented Programming in Python कोर्स देख सकते हैं।

Arunn Thevapalan

लेखक

Arunn Thevapalan

एक वरिष्ठ डेटा वैज्ञानिक के रूप में, मैं बड़े पैमाने पर मशीन‑लर्निंग समाधान डिज़ाइन, विकसित और परिनियोजित करता/करती हूँ ताकि व्यवसाय बेहतर डेटा‑आधारित निर्णय ले सकें। डेटा साइंस लेखक के रूप में, मैं अपने सीख, करियर सलाह, और गहन व्यावहारिक ट्यूटोरियल साझा करता/करती हूँ।

विषय