[python] क्या पाइथन कक्षाओं में "निजी" चर है?



Answers

पाइथन में निजी चर हैक कम या ज्यादा है: दुभाषिया जानबूझकर चर का नाम बदलता है।

class A:
    def __init__(self):
        self.__var = 123
    def printVar(self):
        print self.__var

अब, यदि आप वर्ग परिभाषा के बाहर __var तक पहुंचने का प्रयास करते हैं, तो यह असफल हो जाएगा:

 >>>x = A()
 >>>x.__var # this will return error: "A has no attribute __var"

 >>>x.printVar() # this gives back 123

लेकिन आप आसानी से इससे दूर हो सकते हैं:

 >>>x.__dict__ # this will show everything that is contained in object x
               # which in this case is something like {'_A__var' : 123}

 >>>x._A__var = 456 # you now know the masked name of private variables
 >>>x.printVar() # this gives back 456

आप शायद जानते हैं कि x.printVar() => A.printVar(x) में विधियों को इस तरह से बुलाया जाता है: x.printVar() => A.printVar(x) , यदि A.printVar() x में कुछ फ़ील्ड तक पहुंच सकता है, तो इस क्षेत्र को A.printVar() बाहर भी पहुंचा जा सकता है A.printVar() ... आखिरकार, पुन: प्रयोज्यता के लिए कार्य बनाए जाते हैं, अंदर दिए गए बयानों को कोई विशेष शक्ति नहीं दी जाती है।

एक कंपाइलर शामिल होने पर गेम अलग होता है ( गोपनीयता एक कंपाइलर स्तर अवधारणा है )। यह अभिगम नियंत्रण संशोधक के साथ कक्षा परिभाषा के बारे में जानता है, इसलिए यह संकलित समय पर नियमों का पालन नहीं किया जा सकता है, तो यह त्रुटि हो सकती है

Question

मैं जावा दुनिया से आ रहा हूं और ब्रूस एक्सल्स के पायथन 3 पैटर्न, रेसिपी और इडियम्स पढ़ रहा हूं।

कक्षाओं के बारे में पढ़ते समय, यह कहता है कि पायथन में इंस्टेंस चर घोषित करने की कोई आवश्यकता नहीं है। आप बस उन्हें कन्स्ट्रक्टर में इस्तेमाल करते हैं, और उछालते हैं, वे वहां हैं।

तो उदाहरण के लिए:

class Simple:
    def __init__(self1, str):
        print("inside the simple constructor")
        self1.s = str
    def show(self1):
        print(self1.s)
    def showMsg (self, msg):
        print (msg + ':', self.show())

यदि यह सत्य है, तो क्लास Simple का कोई भी ऑब्जेक्ट क्लास के बाहर परिवर्तनीय s के मान को बदल सकता है।

उदाहरण के लिए:

if __name__ == "__main__":
    x = Simple("constructor argument")
    x.s = "test15" # this changes the value
    x.show()
    x.showMsg("A message")

जावा में, हमें सार्वजनिक / निजी / संरक्षित चर के बारे में सिखाया गया है। वे कीवर्ड समझ में आते हैं क्योंकि कभी-कभी आप कक्षा में चर चाहते हैं जिसके लिए कक्षा के बाहर कोई भी पहुंच नहीं लेता है।

पायथन में इसकी आवश्यकता क्यों नहीं है?




"जावा में, हमें सार्वजनिक / निजी / संरक्षित चर के बारे में सिखाया गया है"

"पाइथन में इसकी आवश्यकता क्यों नहीं है?"

इसी कारण से जावा में इसकी आवश्यकता नहीं है।

आप उपयोग करने के लिए स्वतंत्र हैं - या private और protected उपयोग नहीं करते हैं।

एक पायथन और जावा प्रोग्रामर के रूप में, मैंने पाया है कि private और protected बहुत ही महत्वपूर्ण डिजाइन अवधारणाएं हैं। लेकिन एक व्यावहारिक मामले के रूप में, जावा और पायथन की हजारों लाइनों में, मैंने वास्तव में कभी भी private या protected उपयोग नहीं किया protected

क्यों नहीं?

मेरा सवाल है "किससे संरक्षित?"

मेरी टीम पर अन्य प्रोग्रामर? उनके पास स्रोत है। संरक्षित मतलब क्या है जब वे इसे बदल सकते हैं?

अन्य टीमों पर अन्य प्रोग्रामर? वे एक ही कंपनी के लिए काम करते हैं। वे कर सकते हैं - एक फोन कॉल के साथ - स्रोत प्राप्त करें।

ग्राहकों को? यह काम-के-किराए पर प्रोग्रामिंग (आमतौर पर) है। ग्राहक (आमतौर पर) कोड का मालिक है।

तो, कौन - ठीक है - क्या मैं इसे से बचा रहा हूं?

सही। स्किज़ोफ्रेनिक सोसायपाथ जिन्होंने एपीआई टिप्पणी ब्लॉक पढ़ने से इनकार कर दिया।




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

साथ ही, आप देख सकते हैं कि पायथन ओओपी अवधारणा सही ओओपी अवधारणा के करीब बिल्कुल सही, स्माल्टॉक या रूबी नहीं है। यहां तक ​​कि सी # या जावा करीब हैं।

पायथन बहुत अच्छा उपकरण है। लेकिन यह ओओपी भाषा सरलीकृत है। Syntactically और अवधारणात्मक सरलीकृत। पायथन अस्तित्व का मुख्य लक्ष्य डेवलपर्स को उच्च अस्थिरता स्तर के साथ बहुत तेज़ तरीके से लिखने के लिए आसान पठनीय कोड लिखना है।




एकमात्र बार जब भी मैं निजी चर का उपयोग करता हूं वह तब होता है जब मुझे चर से लिखने या पढ़ने के दौरान अन्य चीजों को करने की आवश्यकता होती है और इस तरह मुझे एक सेटर और / या गेटर के उपयोग को मजबूर करने की आवश्यकता होती है।

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

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

तो मेरा जवाब है; यदि आप और आपके सहयोगी एक साधारण कोड सेट बनाए रखते हैं तो कक्षा चर की रक्षा करना हमेशा आवश्यक नहीं होता है। यदि आप एक एक्स्टेंसिबल सिस्टम लिख रहे हैं तो कोर के परिवर्तन किए जाने पर यह अनिवार्य हो जाता है जिसे कोड का उपयोग करके सभी एक्सटेंशन द्वारा पकड़ा जाना चाहिए।




थ्रेड को "पुनरुत्थान" के लिए खेद है, लेकिन मुझे आशा है कि इससे किसी की मदद मिलेगी:

पायथन 3 में यदि आप क्लास विशेषताओं को "एन्सेप्लेट" करना चाहते हैं, जैसे कि जावा में, आप बस इसी तरह की चीज कर सकते हैं:

class Simple:
    def __init__(self, str):
        print("inside the simple constructor")
        self.__s = str

    def show(self):
        print(self.__s)

    def showMsg(self, msg):
        print(msg + ':', self.show())

इसे तुरंत करने के लिए:

ss = Simple("lol")
ss.show()

ध्यान दें कि: print(ss.__s) एक त्रुटि फेंक देगा।

अभ्यास में, पायथन 3 वैश्विक विशेषता नाम को खराब कर देगा। जावा में जैसे "निजी" विशेषता की तरह इसे चालू करना। विशेषता का नाम अभी भी वैश्विक है, लेकिन एक अप्राप्य तरीके से, अन्य भाषाओं में एक निजी विशेषता की तरह।

लेकिन इससे डरो मत। कोई फर्क नहीं पड़ता कि। यह नौकरी भी करता है। ;)




Related