2013-02-24 125 views
5

मैं पाइथन 3.2 में 'संरक्षित' पहुंच के साथ एक वर्ग पदानुक्रम स्थापित करना चाहता हूं: बेस क्लास के सदस्य केवल व्युत्पन्न कक्षाओं के लिए दायरे में होंगे, लेकिन 'सार्वजनिक' नहीं।"संरक्षित" पहुंच - कैसे?

एक डबल अंडरस्कोर एक सदस्य 'निजी' बनाता है, एक एकल अंडरस्कोर एक चेतावनी इंगित करता है लेकिन सदस्य 'सार्वजनिक' रहता है। क्या (यदि कोई है ...) 'संरक्षित' सदस्य को नामित करने के लिए सही वाक्यविन्यास है।

+6

कोई नहीं कर सकता। '_single_underscore' सम्मेलन का प्रयोग करें और खुश रहें। – JBernardo

उत्तर

8

पायथन में सदस्य पहुंच भत्ता "बातचीत" और "संधि" द्वारा काम करता है, बलपूर्वक नहीं।

दूसरे शब्दों में, आपकी कक्षा के उपयोगकर्ता को उन चीज़ों से हाथ छोड़ना चाहिए जो उनके व्यवसाय नहीं हैं, लेकिन आप _xxx पहचानकर्ताओं का उपयोग करने के अलावा अन्य को लागू नहीं कर सकते हैं, यह स्पष्ट रूप से स्पष्ट है कि उनकी पहुंच (सामान्यतः) उपयुक्त नहीं है ।

+0

तो यह संभव नहीं है। ठीक। लेकिन मुझे 'संधि' के साथ कोई समस्या नहीं है 'बल' जिसे मैंने कई बार आवाज उठाई है: एक्सेस विनिर्देशकों के पीछे विचार वास्तव में अन्य लोगों को कुछ मतलब करने से रोकने के लिए नहीं है। यह आपके कोड के स्पष्ट, संरचित संगठन के बारे में है। मैं चाहता हूं कि मेरी भाषा मुझे ऐसा करने में मदद करे, सभी प्रकार के पागल हैक्स के लिए ओपनिंग न छोड़ें, जो कि पाइथन कोड में आम हैं जो मैं अक्सर देखता हूं। (यह इंगित करता है कि मुझे शायद पाइथन का उपयोग नहीं करना चाहिए ...) – Vector

3

डबल अंडरस्कोर सी ++ या जावा अर्थ में सदस्य 'निजी' नहीं बनाते हैं - पायथन काफी स्पष्ट रूप से उस तरह के भाषा-लागू पहुंच नियमों को छोड़ देता है। एक सिंगल अंडरस्कोर, सम्मेलन द्वारा, एक विशेषता या एक विधि को "क्रियान्वयन विस्तार" के रूप में चिह्नित करता है - यानी, बाहर की चीजें अभी भी इसे प्राप्त कर सकती हैं, लेकिन यह कक्षा 'इंटरफेस का एक समर्थित हिस्सा नहीं है और इसलिए, गारंटी है कि कक्षा इनवेरिएंट या बैक/फॉरवर्ड संगतता के बारे में बता सकती है अब लागू नहीं होती है। यह एक ही तरीके से एक ही वैचारिक समस्या को 'निजी' (इंटरफ़ेस और कार्यान्वयन का पृथक्करण) के रूप में हल करता है। -

डबल रेखांकित नाम mangling जो अभी भी 'निजी' नहीं है आह्वान यह सिर्फ ऊपर है, जिससे की एक थोड़ा मजबूत सूत्रीकरण है: - यह समारोह, इस वर्ग के एक कार्यान्वयन विस्तार है लेकिन - उपवर्गों हो सकता है यथोचित कि जिससे __name क्लास का नाम शामिल करने के लिए घायल है मूल

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

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

+0

'डबल अंडरस्कोर्स सी ++ या जावा भावना में सदस्य' निजी 'नहीं बनाते हैं ...' - समझा। यही कारण है कि उद्धरण में 'निजी' कहा। लेकिन ताज़ा करने के लिए धन्यवाद। – Vector