जब संदेह हो, तो इसे "सार्वजनिक" छोड़ दें - मेरा मतलब है, अपनी विशेषता के नाम को अस्पष्ट करने के लिए कुछ भी न जोड़ें। यदि आपके पास कुछ आंतरिक मूल्य के साथ एक वर्ग है, तो इसके बारे में परेशान न करें। लिखने के बजाय:
class Stack(object):
def __init__(self):
self.__storage = [] # Too uptight
def push(self, value):
self.__storage.append(value)
इसे डिफ़ॉल्ट रूप से लिखें:
class Stack(object):
def __init__(self):
self.storage = [] # No mangling
def push(self, value):
self.storage.append(value)
यह निश्चित रूप से चीजों को करने का एक विवादास्पद तरीका है। पायथन के नए शौक बस इससे नफरत करते हैं और यहां तक कि कुछ पुराने पायथन लोग इस डिफ़ॉल्ट को तुच्छ समझते हैं - लेकिन यह वैसे भी डिफ़ॉल्ट है, इसलिए मैं वास्तव में आपको इसका पालन करने की सलाह देता हूं, भले ही आप असहज महसूस करें।
यदि आप वास्तव में संदेश भेजना चाहते हैं तो "यह स्पर्श नहीं कर सकता!" अपने उपयोगकर्ताओं के लिए, सामान्य तरीका यह है कि एक अंडरस्कोर के साथ चर को पूर्ववर्ती करें । यह सिर्फ एक सम्मेलन है, लेकिन लोग इसे समझते हैं और इस तरह के सामान से निपटने पर दोहरा ध्यान रखते हैं:
class Stack(object):
def __init__(self):
self._storage = [] # This is ok but pythonistas use it to be relaxed about it
def push(self, value):
self._storage.append(value)
यह संपत्ति के नाम और विशेषता नामों के बीच संघर्ष से बचने के लिए भी उपयोगी हो सकता है:
class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age if age >= 0 else 0
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age >= 0:
self._age = age
else:
self._age = 0
डबल अंडरस्कोर के बारे में क्या? खैर, डबल अंडरस्कोर जादू का उपयोग मुख्य रूप से विधियों के आकस्मिक अतिभार से बचने और सुपरक्लेसेस की विशेषताओं के साथ नाम संघर्ष के लिए किया जाता है । यह काफी उपयोगी हो सकता है यदि आप एक वर्ग लिखते हैं जिसे कई बार बढ़ाया जाना अपेक्षित है।
यदि आप इसे अन्य उद्देश्यों के लिए उपयोग करना चाहते हैं, तो आप कर सकते हैं, लेकिन यह न तो सामान्य है और न ही अनुशंसित है।
संपादित करें : ऐसा क्यों है? ठीक है, सामान्य पायथन शैली चीजों को निजी बनाने पर जोर नहीं देती है - इसके विपरीत! इसके कई कारण हैं - उनमें से अधिकांश विवादास्पद हैं ... आइए हम उनमें से कुछ को देखते हैं।
अजगर में गुण होते हैं
अधिकांश ओओ भाषाएं आज विपरीत दृष्टिकोण का उपयोग करती हैं: जो प्रयोग नहीं किया जाना चाहिए वह दृश्यमान नहीं होना चाहिए, इसलिए विशेषताएँ निजी होनी चाहिए। सैद्धांतिक रूप से, यह अधिक प्रबंधनीय, कम युग्मित वर्गों का उत्पादन करेगा, क्योंकि कोई भी वस्तुओं के अंदर मूल्यों को लापरवाही से नहीं बदलेगा।
हालाँकि, यह इतना सरल नहीं है। उदाहरण के लिए, जावा कक्षाओं में बहुत अधिक विशेषताएँ और गेटर्स होते हैं जो केवल मान प्राप्त करते हैं और बस मान सेट करते हैं। आपको जरूरत है, हम कहते हैं, एक विशेषता को घोषित करने के लिए कोड की सात लाइनें - जिसे पायथन प्रोग्रामर कहेंगे, अनावश्यक रूप से जटिल है। इसके अलावा, व्यवहार में, आप केवल एक सार्वजनिक क्षेत्र प्राप्त करने के लिए इस पूरे कोड को लिखते हैं, क्योंकि आप गेटर्स और सेटर का उपयोग करके इसके मूल्य को बदल सकते हैं।
तो इस निजी-डिफ़ॉल्ट नीति का पालन क्यों करें? बस डिफ़ॉल्ट रूप से अपनी विशेषताओं को सार्वजनिक करें। बेशक, यह जावा में समस्याग्रस्त है, क्योंकि यदि आप अपनी विशेषता के लिए कुछ सत्यापन जोड़ने का निर्णय लेते हैं, तो आपको सभी को बदलने की आवश्यकता होगी
person.age = age;
अपने कोड में, हम कहते हैं,
person.setAge(age);
setAge()
किया जा रहा है:
public void setAge(int age) {
if (age >= 0) {
this.age = age;
} else {
this.age = 0;
}
}
तो जावा (और अन्य भाषाओं) में, डिफ़ॉल्ट वैसे भी गेटर्स और सेटर का उपयोग करना है, क्योंकि वे लिखने के लिए कष्टप्रद हो सकते हैं, लेकिन यदि आप खुद को उस स्थिति में पाते हैं, जो आपको वर्णित है, तो आपको बहुत समय बचा सकता है।
हालाँकि, आपको इसे पायथन में करने की आवश्यकता नहीं है, क्योंकि पायथन में गुण हैं। यदि आपके पास यह वर्ग है:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
और फिर आप उम्र को मान्य करने का निर्णय लेते हैं, आपको person.age = age
अपने कोड के टुकड़ों को बदलने की आवश्यकता नहीं है । बस एक संपत्ति जोड़ें (जैसा कि नीचे दिखाया गया है)
class Person(object):
def __init__(self, name, age):
self.name = name
self._age = age if age >= 0 else 0
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age >= 0:
self._age = age
else:
self._age = 0
यदि आप इसे कर सकते हैं और अभी भी उपयोग कर सकते हैं person.age = age
, तो आप निजी फ़ील्ड और गेटर्स और सेटर क्यों जोड़ेंगे?
(यह भी देखें कि पायथन जावा नहीं है और यह लेख गेटर्स और सेटर का उपयोग करने के नुकसान के बारे में है ।)
सब कुछ वैसे भी दिखाई देता है - और छिपाने की कोशिश करना आपके काम को जटिल बनाता है
यहां तक कि उन भाषाओं में जहां निजी विशेषताएं हैं, आप उन्हें किसी प्रकार के प्रतिबिंब / आत्मनिरीक्षण पुस्तकालय के माध्यम से एक्सेस कर सकते हैं। और लोग इसे बहुत कुछ करते हैं, रूपरेखा में और तत्काल जरूरतों को हल करने के लिए। समस्या यह है कि आत्मनिरीक्षण पुस्तकालय केवल सार्वजनिक विशेषताओं के साथ कर सकने का एक कठिन तरीका है।
चूँकि पायथन एक बहुत ही गतिशील भाषा है, इसलिए इस बोझ को अपनी कक्षाओं में जोड़ना अभी ठीक नहीं है।
समस्या को देखना संभव नहीं है - यह देखने के लिए आवश्यक है
पाइथोनिस्टा के लिए, एनकैप्सुलेशन कक्षाओं के आंतरिक को देखने की अक्षमता नहीं है, लेकिन इसे देखने से बचने की संभावना है। मेरा मतलब है कि, एनकैप्सुलेशन एक घटक की संपत्ति है जो इसे उपयोगकर्ता के आंतरिक विवरण के बारे में चिंतित होने के बिना उपयोग करने की अनुमति देता है। यदि आप इसके कार्यान्वयन के बारे में खुद को परेशान किए बिना एक घटक का उपयोग कर सकते हैं, तो यह एनकैप्सुलेटेड है (एक पायथन प्रोग्रामर की राय में)।
अब, यदि आपने अपनी कक्षा को इस तरह से लिखा है, तो आप कार्यान्वयन विवरण के बारे में सोचने के बिना इसका उपयोग कर सकते हैं, यदि आप किसी कारण से कक्षा के अंदर देखना चाहते हैं तो कोई समस्या नहीं है । मुद्दा यह है: आपका एपीआई अच्छा होना चाहिए और बाकी विवरण है।
गुइडो ने ऐसा कहा
खैर, यह विवादास्पद नहीं है: उन्होंने ऐसा कहा, वास्तव में । ("किमोनो खोलें" के लिए देखें)
यह संस्कृति है
हां, कुछ कारण हैं, लेकिन कोई महत्वपूर्ण कारण नहीं है। यह ज्यादातर पायथन में प्रोग्रामिंग का एक सांस्कृतिक पहलू है। सच कहूँ तो, यह दूसरा तरीका भी हो सकता है - लेकिन ऐसा नहीं है। इसके अलावा, आप बस के रूप में आसानी से दूसरे तरीके से पूछ सकते हैं: कुछ भाषाएं डिफ़ॉल्ट रूप से निजी विशेषताओं का उपयोग क्यों करती हैं? अजगर अभ्यास के लिए मुख्य कारण के रूप में: क्योंकि यह इन भाषाओं की संस्कृति है, और प्रत्येक विकल्प के फायदे और नुकसान हैं।
चूंकि पहले से ही यह संस्कृति है, इसलिए आपको इसका पालन करने की सलाह दी जाती है। अन्यथा, __
जब आप स्टैक ओवरस्ट्रीम में एक प्रश्न पूछेंगे , तो पायथन प्रोग्रामर आपको अपने कोड से हटाने के लिए कहेंगे।