2012-06-10 17 views
7

बस एक त्वरित सवाल है, मुझे समझ में थोड़ा कठिनाई हो रही है कि गुण बनाम कहां उपयोग करें जहां सादे पुराने गुणों का उपयोग किया जाता है। मेरे लिए भेद थोड़ा धुंधला है। विषय पर कोई भी संसाधन शानदार होगा, धन्यवाद! जब से तुम कार्यों का वर्णन क्या होने, जब की स्थापना हो रही है या हटा देना माना जाता है परिभाषित कर सकते हैंपाइथन में गुणों का उपयोग कब करें विशेषताएँ बनाम कब उपयोग करें?

+3

के बारे में

नाइस पेज बस नियमित रूप से विशेषताओं का उपयोग करें जब तक आप पाते हैं कि आप विशेषता रही या सेटिंग के दौरान कुछ "विशेष" क्या करना है। फिर एक संपत्ति का उपयोग करें। या, यदि आप विशेषता को केवल पढ़ने के लिए चाहते हैं। – Keith

+0

यह मेरे लिए अजीब बात है कि पाइथन समुदाय में लोग सी # समुदाय के लोगों की तुलना में इस प्रश्न के सही उत्तर को समझने के लिए प्रतीत होते हैं, जहां उनके पास ऐसे उपकरण होते हैं जो समान तरीके से काम करते हैं। –

उत्तर

15

गुण, गुण से अधिक लचीला कर रहे हैं। यदि आपको इस अतिरिक्त लचीलापन की आवश्यकता नहीं है, तो विशेषताओं का उपयोग करें - उन्हें घोषित करना और तेज़ करना आसान है।

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

+0

+1, लेकिन मैं काफी विपरीत कहूंगा, यानी मेरे लिए, _attribute_ अधिक लचीला है, इस अर्थ में कि यह _completely_ मुक्त है, आप डेटा के साथ-साथ बाहर से, जो कुछ भी चाहते हैं, कर सकते हैं। .. दूसरी तरफ, _property_ को घुमाया जाता है, नियंत्रित, प्रतिबंधित, बाध्य किया जाता है (लेकिन मैं मानता हूं कि हम इन क्षमताओं को एक प्रकार की _flexibility_ के रूप में भी देख सकते हैं) एक encapsulation तंत्र द्वारा ... लेकिन मुझे लगता है कि यह वही बात है , बस यह कहने का तरीका अलग है :-) – cedbeu

+0

@cblab: प्रश्न * वर्ग कार्यान्वयन * के दृष्टिकोण से उत्पन्न हुआ था। एक वर्ग कार्यान्वयन के लिए, गुण अधिक लचीला होते हैं, क्योंकि आप गुणों के साथ विशेषताओं के सटीक व्यवहार को अनुकरण कर सकते हैं। –

+0

आह, हाँ, सच ... मुझे यह स्वीकार करना होगा कि मैंने कभी संपत्ति के साथ एक विशेषता के उपयोग को अनुकरण करने के बारे में सोचा नहीं है ... थोड़े बेकार नाप? यह कोड की रेखाएं जोड़ने जैसा है जिसमें वहां होने से कोई अन्य लक्ष्य नहीं है :) लेकिन आप बिल्कुल सही हैं, इस अर्थ में यह और अधिक लचीलापन कर सकता है। – cedbeu

13

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

+4

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

+0

मैं पूरी तरह से सहमत नहीं हूं। कभी-कभी कोई संपत्ति होने के लिए कुछ परिभाषित करने के साथ _start_ करना चाहता है। उदाहरण के लिए जब आप इसके मान को केवल पढ़ने के लिए चाहते हैं, या यह कुछ ऐसा है जिसे आवश्यक होने पर गणना की जा सकती है लेकिन संदर्भित नहीं किया जाता है ताकि प्रत्येक उदाहरण में अपना मूल्य संग्रहीत करने के लिए पर्याप्त रूप से पर्याप्त हो। – martineau

+0

आप किसी भी भाषा में बाद में कुछ भी बदल सकते हैं; यह सिर्फ एक सवाल है कि कितना काम शामिल है। –

0

क्या डैनियल Roseman कहा के अलावा, मैं अक्सर गुणों का उपयोग जब मैं कुछ कर रहा हूँ लपेटकर अर्थात जब मैं जानकारी अपने आप की दुकान नहीं है, लेकिन लिपटे वस्तु करता है। फिर गुण उत्कृष्ट एक्सेसर्स बनाते हैं।

+0

हां, वास्तव में आप इसे स्वचालित रूप से लपेटा हुआ ऑब्जेक्ट से उत्पन्न कर सकते हैं, और फिर आपके ऑब्जेक्ट में जो कुछ भी आप लपेट रहे हैं, उसके सभी तरीके और गुण हैं। बेहद सुविधाजनक। – kindall

1

गुण विशेषताएँ एक पोस्टरियोरी encapsulation हैं।

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

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

ऐसा है तो आपने सिर्फ setters और ही टिककर खेल, केवल अगर जरूरत परिभाषित कर सकते हैं, और उन्हें विशेषता को "देते हैं", यह एक संपत्ति में तब्दील हो, अपने कोड के बाकी पर किसी भी घटना के बिना है (जबकि जावा, पहली बात तो आप आमतौर पर जब एक क्षेत्र, आमतौर पर निजी बनाने कर में, यह गेटर और सेटर विधि) संबद्ध है बनाने के लिए है। गुण, गुण और वर्णनकर्ता here

संबंधित मुद्दे