यह प्रश्न this one asked earlier और this one पर भी बनाता है, लेकिन एक अधिक सूक्ष्म बिंदु को संबोधित करता है, विशेष रूप से, "आंतरिक वर्ग" के रूप में क्या मायने रखता है?पायथन कक्षा के नामों में अग्रणी अंडरस्कोर
यहाँ मेरी स्थिति है। मैं एमएस ऑफ़िस फ़ाइलें, जिसमें वर्गों में से कई बाहर से निर्माण किया जा करने के लिए नहीं कर रहे हैं जोड़ तोड़ के लिए एक अजगर लाइब्रेरी बनाना रहा हूँ, उनके तरीकों में से अभी तक कई एपीआई के महत्वपूर्ण हिस्से हैं। उदाहरण के लिए:
class _Slide(object):
def add_shape(self):
...
_Slide
बाहर से निर्माण किया जा करने के लिए, पुस्तकालय की एक अंतिम-उपयोगकर्ता के रूप में आप Presentation.add_slide()
को फोन करके एक नई स्लाइड प्राप्त नहीं है। हालांकि, एक बार आप एक स्लाइड है आप निश्चित रूप से add_shape()
कॉल करने के लिए सक्षम होना चाहते हैं। तो विधि एपीआई का हिस्सा है लेकिन कन्स्ट्रक्टर नहीं है। यह स्थिति लाइब्रेरी में दर्जनों बार उत्पन्न होती है क्योंकि केवल प्रेजेंटेशन क्लास में बाहरी/एपीआई कन्स्ट्रक्टर होता है।
PEP8 क्या एक आंतरिक वर्ग के रूप में गिना जाता है के विस्तार के बिना "आंतरिक वर्ग" के संदर्भ बनाने इस मुद्दे पर अस्पष्ट है,। इस मामले में मुझे लगता है कि कोई कह सकता है कि वर्ग "आंशिक रूप से आंतरिक" है।
- निर्माता और वर्ग के "सार्वजनिक/एपीआई" तरीकों सभी के उपयोग के लिए उपलब्ध हैं:
समस्या मैं केवल कम से कम तीन अलग स्थितियों में भेद करने के दो अंकन है।
- निर्माता प्रयोग किया जाता है नहीं करने के लिए किया जाएगा, लेकिन "सार्वजनिक/एपीआई" वर्ग के तरीके हैं।
- कक्षा वास्तव में आंतरिक है, इसमें कोई सार्वजनिक एपीआई नहीं है, और मैं इसे भविष्य में रिलीज में बदलने या हटाने का अधिकार सुरक्षित रखता हूं।
मैं ध्यान दें एक संचार के नजरिए से, वहाँ बाहरी API के स्पष्ट अभिव्यक्ति (पुस्तकालय अंतिम-उपयोगकर्ता दर्शकों) और आंतरिक एपीआई (डेवलपर ऑडियंस) के बीच एक संघर्ष है। एक अंत उपयोगकर्ता के लिए, बुला _Slide()
verboten है/पर-खुद जोखिम। हालांकि यह आंतरिक एपीआई का एक खुश सदस्य है और _random_helper_method()
से अलग है जिसे केवल _Slide()
के भीतर से बुलाया जाना चाहिए।
क्या आपके पास इस प्रश्न पर एक दृष्टिकोण है जो मेरी मदद कर सकता है? क्या सम्मेलन यह निर्देश देता है कि मैं एंड-यूजर एपीआई में स्पष्टता के लिए लड़ने के लिए कक्षा के नाम पर अपने "एकल-अग्रणी-अंडरस्कोर" गोला बारूद का उपयोग करता हूं या क्या मैं खुद को और अन्य डेवलपर्स से संवाद करने के लिए इसे सुरक्षित रखने के बारे में अच्छा महसूस कर सकता हूं, जब कक्षा एपीआई वास्तव में है निजी और उपयोग नहीं किया जाना चाहिए, उदाहरण के लिए, मॉड्यूल के बाहर वस्तुओं द्वारा यह रहता है क्योंकि यह एक कार्यान्वयन विस्तार है जो बदल सकता है?
अद्यतन: आगे प्रतिबिंब के कुछ वर्षों के बाद, मैं जब कि उनके मॉड्यूल के बाहर एक वर्ग के रूप में पहुँचा जा करने का इरादा नहीं कर रहे हैं वर्गों का नामकरण एक अग्रणी अंडरस्कोर का उपयोग कर के सम्मेलन में बसे है (फ़ाइल)। इस तरह की पहुंच आम तौर पर उस वर्ग के किसी ऑब्जेक्ट को तुरंत चालू करने या कक्षा विधि तक पहुंचने के लिए होती है।
यह मॉड्यूल के उपयोगकर्ताओं को प्रदान करता है (अक्सर स्वयं ही मूलभूत संकेतक: "यदि एक प्रमुख अंडरस्कोर वाला क्लास नाम एक आयात कथन में प्रकट होता है, आप कुछ गलत कर रहे हैं। " (इकाई परीक्षण मॉड्यूल इस नियम के अपवाद हैं, इस तरह के आयात अक्सर एक "आंतरिक" वर्ग के लिए इकाई परीक्षण में दिखाई दे सकते हैं।)
ध्यान दें कि यह वर्ग के लिए उपयोग है।मॉड्यूल के बाहर उस श्रेणी (प्रकार) के ऑब्जेक्ट तक पहुंच, शायद किसी फैक्ट्री या जो कुछ भी प्रदान की गई हो, पूरी तरह से ठीक है और शायद अपेक्षित है। मुझे लगता है कि उनसे बनाए गए वस्तुओं से वर्गों को अलग करने में यह विफलता मेरे शुरुआती भ्रम की वजह से थी।
इस सम्मेलन में from module import *
कथन बनाते समय इन कक्षाओं को शामिल करने का साइड लाभ भी है। हालांकि मैं इन्हें अपने कोड में कभी भी उपयोग नहीं करता हूं और उन्हें टालने की सलाह देता हूं, यह एक उचित व्यवहार है क्योंकि उन वर्ग पहचानकर्ताओं को मॉड्यूल इंटरफ़ेस का हिस्सा बनने का इरादा नहीं है।
यह परीक्षण के वर्षों के बाद मेरा व्यक्तिगत "सर्वोत्तम अभ्यास" है, और निश्चित रूप से "सही" तरीका नहीं है। आपकी माइलेज भिन्न हो सकती है।
मुझे यह तय करने में थोड़ा सा लगा कि यह मुख्य रूप से राय-आधारित के रूप में नहीं गिना जाना चाहिए। यद्यपि शब्द में सुधार किया जा सकता है। – user2357112
'Presentation.add_slide()' को कॉल करने के बाद, जिस स्लाइड को बनाया गया था, उसे कैसे पहुंचाया जा सकता है? यदि यह '_Slide()' उदाहरण के माध्यम से है, तो उपयोगकर्ता के पास '_Slide' प्रभावी रूप से एक सार्वजनिक वर्ग है। – martineau
@ मार्टिनौ: मुझे लगता है कि यह काफी जवाब है। आपके द्वारा वर्णित निष्कर्ष के बाद मैं यह आया हूं कि यदि कक्षा का कोई हिस्सा नहीं है (कन्स्ट्रक्टर, विधियों) का उपयोग * मॉड्यूल के बाहर * होता है। और कक्षा के नामों में एक अग्रणी अंडरस्कोर का उपयोग कक्षाओं के लिए किया जाना चाहिए जो इस विवरण को पूरा करते हैं। यदि आप एक उत्तर में डाल देंगे तो मैं इसे स्वीकार करूंगा। – scanny