पायथन में स्पष्ट पहुंच संशोधक क्यों नहीं हैं:


28

यदि 'स्पष्ट रूप से निहित से बेहतर है', तो पाइथन में स्पष्ट पहुंच संशोधक क्यों नहीं हैं: सार्वजनिक, संरक्षित, निजी, आदि।

मुझे पता है कि विचार यह है कि प्रोग्रामर को पता होना चाहिए कि संकेत के माध्यम से क्या करना है - 'ब्रूट बल' का उपयोग करने की आवश्यकता नहीं है। लेकिन IMO 'एनकैप्सुलेशन' या 'सूचना छिपाना' सिर्फ लोगों को बाहर रखने के लिए नहीं है, यह संगठन और संरचना का सवाल है: आपकी विकास परतों में भौतिक प्रणालियों की तरह ही आत्म-परिभाषित, स्पष्ट रूप से सीमांकित स्कोप और बॉर्डर होना चाहिए।

क्या कोई कृपया मुझे यहाँ एक ठोस व्याख्या के साथ मदद कर सकता है कि पायथन में स्पष्ट रूप से प्रवेश करने के बजाय पहुँच प्रतिबंध क्यों लगाया जाता है, एक भाषा जो अन्यथा एकदम सही लगती है?

संपादित करें: अब तक मैंने 3 प्रस्तावित उत्तर देखे हैं, और मुझे महसूस हुआ कि मेरे प्रश्न के 2 भाग हैं:

  1. उदाहरण के लिए मुख्य शब्द क्यों नहीं हैं

    private def myFunc(): 
        dostuff....
    

    IMO के बजाय बदसूरत और कठिन प्रकार अंडरस्कोर करने के लिए। लेकिन वह महत्वपूर्ण बिंदु नहीं है।

  2. अधिक महत्वपूर्ण बात:

    ये एक्सेस मॉडिफ़ायर केवल 'अनुशंसाएँ' या संकेत क्यों हैं और लागू नहीं किए गए हैं। बाद में बदलना मुश्किल होगा? 'संरक्षित ’को' पब्लिक’ में बदलना बहुत सरल है - और यदि आपके पास एक जटिल विरासत श्रृंखला है जो इसे कठिन बनाती है, तो आपके पास एक खराब डिज़ाइन है - आपके डिज़ाइन को एक भाषा सुविधा पर भरोसा करने के बजाय परिष्कृत किया जाना चाहिए जो इसे लिखना आसान बनाता है खराब संरचित कोड।

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

जितना मैं पायथन से प्यार करता हूं, मुझे यह 2 वां बिंदु एक गंभीर कमी लग रही है। और मुझे इसके लिए एक अच्छा जवाब देखना बाकी है।


पायथन में एक्सेस स्पेसियर्स का संभावित डुप्लिकेट : ... जो रचनात्मक नहीं होने के कारण बंद था।
फ्रैंक शियरार

2
@ यह अधिक रचनात्मक होने का प्रयास करने के लिए उस सवाल का फिर से पूछना है। मैंने आगे बढ़कर मूल प्रश्न हटा दिया है।

@ मर्क ट्रैप: आह ठीक है। स्पष्टीकरण के लिए धन्यवाद। मैं यह नहीं देख सकता कि कैसे मेरे वोट को बंद करें।
फ्रैंक शीयर

@Frank यह अपने आप दूर हो जाएगा।
एडम लीयर

समस्या private def whateverयह class x: def whatever(self): passहै कि, के लिए एक शॉर्टकट है class x: pass; x.whatever = lambda self: pass, इसलिए मूल रूप से, आपको असाइनमेंट के लिए एक निजी
मध्यस्थ की

जवाबों:


22

"स्पष्ट से बेहतर है निहित" पायथन के डिजाइन दर्शन में अधिकतम में से एक है। "सरल जटिल से बेहतर है" वहाँ भी है। और, हालांकि यह पायथन के ज़ेन में नहीं है, "हम यहां सभी वयस्कों को सहमति दे रहे हैं" एक और है।

यह दूसरा नियम शायद यहाँ सबसे महत्वपूर्ण है। जब मैं एक क्लास डिजाइन करता हूं, तो मुझे कुछ अंदाजा होता है कि यह कैसे इस्तेमाल होने वाला है। लेकिन मैं संभवतः सभी संभावित उपयोगों की भविष्यवाणी नहीं कर सकता। यह हो सकता है कि मेरे कोड के कुछ भविष्य के उपयोग के लिए उन चरों की पहुंच आवश्यक हो जो मैंने निजी समझी है। मुझे इसे कठिन क्यों बनाना चाहिए - या यहां तक ​​कि असंभव - इन तक पहुंचने के लिए, यदि भविष्य के प्रोग्रामर (या यहां तक ​​कि भविष्य के मेरे) को उनकी आवश्यकता है? सबसे अच्छी बात यह है कि उन्हें एक चेतावनी के साथ चिह्नित किया जाए - जैसा कि जूनस नोट्स, एक एकल अंडरस्कोर उपसर्ग मानक है - कि वे आंतरिक हैं, और बदल सकते हैं; लेकिन पूरी तरह से मना करना अनावश्यक लगता है।


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

@ फ्रेंक: "" प्राइवेट "श्रेणी में एक विधि डालना एक संकेत है जिसे आपको उपयोग करने से पहले तीन बार सोचना चाहिए, और नहीं" मेरे लिए, इसका मतलब है कि मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है जब मैं काम नहीं कर रहा हूँ इसके साथ।
वेक्टर

8
निजी सदस्यों के लिए मना करने का एक अच्छा कारण है: क्योंकि यह वर्ग के आक्रमणकारियों को तोड़ सकता है। यदि आप निजी सदस्यों को नहीं लिख सकते हैं, तो आप यह सुनिश्चित नहीं कर सकते कि आपकी कक्षा सही ढंग से व्यवहार करती है।
svick

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

3
इससे अधिक विवाद नहीं हो सकता। एक्सेस मॉडिफायर बड़े सॉफ्टवेयर में जटिलता को कम करने के लिए संभवतः सबसे अच्छी समझ वाली अवधारणाओं में से दो को बढ़ावा देते हैं: चिंता और अलगाव की चिंता। दोनों में से न तो सेवा करने का मतलब है कि अजगर अच्छी ओओपी भाषा नहीं है और न ही बड़े सॉफ्टवेयर के निर्माण के लिए उपयुक्त है और इसमें कुछ भी गलत नहीं है। लेकिन ठेठ hobbyist तर्कों के साथ ऐसी विशेषताओं की अनुपस्थिति को उचित ठहराते हैं जैसे "आवश्यकता होने पर जटिलता क्यों जोड़ें?" बस गलत है।
डेनियल शिन

10

मुझे संदेह है कि मिसिंग एक्सेस मॉडिफक्टर्स का मुख्य कारण सरलता है

जैसा कि आप कहते हैं, यह लोगों को इसके संगठन के बारे में बाहर रखने के बारे में नहीं है, इसलिए 'निजी' का मुख्य बिंदु यह है कि यह आपके एपीआई के उपयोगकर्ताओं को एक संदेश भेजता है 'कृपया न लिखें कोड जो इस पर निर्भर करता है'।

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

class ActiveRow(object):
    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

अभिगम्यता पर ध्यान कैसे दें?

मुझे लगता है, यह एक व्यापार था। यदि आप सख्ती से इसके साथ नहीं रह सकते हैं, तो मैं रूबी का सुझाव दूंगा, जिसमें अमूर्त और गतिशीलता का समान स्तर है, लेकिन एक ऑब्जेक्ट मॉडल है, जो एक्सेस संशोधन की अनुमति देता है।


8
मुझे लगता है कि यह सही है, लेकिन IMO, यह भयानक है। __Method__ को बेचने वाले अंक के रूप में लालित्य और पठनीयता का उपयोग करने वाली भाषा के लिए, बहुत जघन्य-दिखने वाला और अप्रिय है।
जिगी

2
कन्वेंशन नहीं, __x__'मैजिक' हैं, (यानी वे विधियाँ जो भाषा एकीकरण को सक्षम करने के लिए कहलाती हैं जैसे ऑपरेटर ओवरलोडिंग, पुनरावृत्ति इत्यादि)। सम्मेलन है _x
कीपला

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

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

5
@ जिग्गी: "मैं इसे पसंद करने के लिए बहुत कोशिश कर रहा हूं"। मैंने 2 साल तक कोशिश की - फिर हार मान ली। :-( एक स्क्रिप्टिंग भाषा होने की अपील करता है, जिसे वास्तविक ओओपी भाषा की तरह व्यवहार करने के लिए हैक किया गया था। मैं पायथन में एक बड़े, जटिल ऐप को लिखने की कल्पना नहीं कर सकता जो अच्छी तरह से डिजाइन और पठनीय था। जैसा कि आपने कहा था 'आप 10X अधिक प्रयास खर्च करते हैं। यह निर्माण 'से कोड को बनाए रखने के सरल OOP और प्रकार सुरक्षित अवधारणाओं की आवश्यकता होती है पागल हैक्स और
वेक्टर

8

पायथन सम्मेलन संरक्षित / निजी सदस्यों के लिए एक अंडरस्कोर उपसर्ग का उपयोग करना है।

यह कन्वेंशन, जब अनुसरण किया जाता है, तो प्रभावी रूप से एक्सेस संशोधक के समान है, 1 को छोड़कर) आप सीधे सदस्य के नाम से देखेंगे कि यह सार्वजनिक है या नहीं, और 2) यदि आप वास्तव में चाहते हैं तो आप "एनकैप्सुलेशन" को तोड़ सकते हैं (यह उचित हो सकता है) उदाहरण के लिए परीक्षण; कुछ अन्य भाषाओं में आपको प्रतिबिंब == अधिक कोड का उपयोग करना होगा)।

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


2
"यदि आप विशेष कीवर्ड के बिना एक ही चीज़ (थोड़ा अधिक लचीलेपन के साथ) कर सकते हैं, तो भाषा छोटी होगी और कोड अधिक संक्षिप्त होगा" मेरी राय में, यह आमतौर पर सच नहीं है। (यहां तक ​​कि अगर यह एक्सेस मॉडिफायर के विशेष मामले के साथ सच हो सकता है)
बेंजामिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.