python tutorial चर और विधियों के साथ अंडरस्कोर बनाम डबल अंडरस्कोर




python tutorial pdf (3)

इस प्रश्न का उत्तर यहां दिया गया है:

कोई मुझे यह बताने के लिए काफी अच्छा था कि __method () मैंगल्स लेकिन उसे और परेशान करने की बजाय, ऐसे कई अन्य लोग हैं जिन्हें सहायता चाहिए, मैं सोच रहा था कि कोई अंतर भिन्नता को विस्तारित कर सकता है या नहीं।

उदाहरण के लिए मुझे उलझन की जरूरत नहीं है, लेकिन _ निजी रहती है इसलिए कोई उदाहरण नहीं कर सकता ._method ()? या क्या यह इसे अद्वितीय बनाकर एक और चर को ओवरराइट करने से रोकता है? मुझे अपने आंतरिक तरीकों की आवश्यकता नहीं है "छुपा" लेकिन चूंकि वे उपयोग करने के लिए विशिष्ट हैं, इसलिए मैं नहीं चाहता कि उन्हें कक्षा के बाहर इस्तेमाल किया जाए।


पायथन में कोई पहुंच नियंत्रण नहीं है। आप कक्षा के सभी विशेषताओं तक पहुंच सकते हैं, और इसमें _class__variable नाम शामिल हैं ( _class__variable रूप में)। अपने आप से डेवलपर्स की रक्षा करने की कोशिश करने के बजाय अपने कोड और एपीआई पर ध्यान केंद्रित करें।


पीईपी 8 से :

  • _single_leading_underscore : कमजोर "आंतरिक उपयोग" संकेतक। उदाहरण के लिए

    from M import *

    ऑब्जेक्ट्स आयात नहीं करता जिसका नाम अंडरस्कोर से शुरू होता है।

  • single_trailing_underscore_ : पाइथन कीवर्ड के साथ संघर्ष से बचने के लिए सम्मेलन द्वारा उपयोग किया जाता है, उदाहरण के लिए

    Tkinter.Toplevel(master, class_='ClassName')

  • __double_leading_underscore : जब क्लास एट्रिब्यूट का नामकरण होता है, तो नाम __double_leading_underscore आह्वान करता है (कक्षा FooBar अंदर, __boo बन जाता है; नीचे देखें)।

  • __double_leading_and_trailing_underscore__ : "जादू" ऑब्जेक्ट्स या विशेषताएँ जो उपयोगकर्ता द्वारा नियंत्रित नेमस्पेस में रहते हैं। जैसे __init__ , __import__ या __file__ । ऐसे नामों का आविष्कार न करें; केवल उन्हें दस्तावेज के रूप में उपयोग करें।

इसके अलावा, डेविड गुजर कोड से एक पाइथोनिस्टा की तरह :

विशेषताएं: interface , _internal , __private

लेकिन __private रूप से बचने की कोशिश करें। मैंने कभी इसका इस्तेमाल नहीं किया। मुझ पर विश्वास करो। यदि आप इसका इस्तेमाल करते हैं, तो आपको बाद में खेद होगा।

स्पष्टीकरण:

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

समस्या यह है कि एक वर्ग के लेखक वैध रूप से सोच सकते हैं कि "यह विशेषता / विधि का नाम निजी होना चाहिए, केवल इस वर्ग परिभाषा के भीतर से सुलभ होना चाहिए" और __private सम्मेलन का उपयोग करें। लेकिन बाद में, उस वर्ग का कोई उपयोगकर्ता उप-वर्ग बना सकता है जिसे वैध रूप से उस नाम तक पहुंच की आवश्यकता होती है। तो या तो सुपरक्लास को संशोधित करना होगा (जो मुश्किल या असंभव हो सकता है), या उप-वर्ग कोड को मैन्युअल रूप से उलझन वाले नामों का उपयोग करना होगा (जो कि बदसूरत और नाजुक है)।

पायथन में एक अवधारणा है: "हम सभी यहां वयस्कों की सहमति दे रहे हैं"। यदि आप __private फॉर्म का उपयोग करते हैं, तो आप किस विशेषता से रक्षा कर रहे हैं? सुपरक्लास को उचित रूप से सुपरक्लास से विशेषताओं का उपयोग करने की ज़िम्मेदारी है, और सुपरक्लास की ज़िम्मेदारी उनके गुणों को सही तरीके से दस्तावेज करने की ज़िम्मेदारी है।

एकल-अग्रणी-अंडरस्कोर सम्मेलन का उपयोग करना बेहतर है, _internal । "यह नाम बिल्कुल उलझन में नहीं है; यह सिर्फ दूसरों को इंगित करता है कि" इससे सावधान रहें, यह एक आंतरिक कार्यान्वयन विस्तार है; अगर आप इसे पूरी तरह समझ नहीं पाते हैं तो इसे छूएं नहीं। "हालांकि यह केवल एक सम्मेलन है।


एक अग्रणी अंडरस्कोर बस एक सम्मेलन है जिसका अर्थ है, "आपको शायद इसका उपयोग नहीं करना चाहिए।" यह किसी को विशेषता का उपयोग करने से रोकने के लिए कुछ भी नहीं करता है।

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







python