क्या आप गेट / सेट पैटर्न (पायथन में) का उपयोग करते हैं?


82

जावा में (विभिन्न कारणों से) गेट / सेट का उपयोग करना एक आम बात है, लेकिन मैं शायद ही इसका उपयोग करने वाले पायथन कोड को देखता हूं।

आप पायथन में विधियों का उपयोग / सेट करने से क्यों बचते हैं?


सभी से Greate प्रतिक्रियाएँ। बेशक, यह सवाल इस एक stackoverflow.com/questions/1022970/… का ऑफशूट है , हालांकि, ऐसा लगता है कि मुझे "जे" -शब्द के नजरिए से देखने वाले लोगों की भीड़ द्वारा छापा गया था। मेरे विश्वास को फिर से बहाल करने के लिए धन्यवाद ...
Avery Payne

1
संदर्भ महत्वपूर्ण है, और यहां पायथन और जावा बस अलग हैं। (हालाँकि, मैंने पायथन को शीर्षक से हटा दिया क्योंकि हम SO पर उस के लिए टैग का उपयोग करते हैं।)

जवाबों:


59

अच्छा लिंक: अजगर जावा नहीं है :)

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


3
प्लस सेटर / गेटर्स प्रदर्शन लागत को जोड़ते हैं, खासकर पायथन में।
निक डंडौलकिस

4
यह करता क्लास डिज़ाइनर पर एक अतिरिक्त बोझ डाल, कि उदाहरण चर परोक्ष वर्ग के सार्वजनिक एपीआई का हिस्सा बन में। जब आप एक क्लास लगाते हैं, तो स्पष्ट रूप से सोचें कि आप किस उदाहरण के चर को बाहरी रूप से एक्सेस करना चाहते हैं, जो कि वास्तव में आपके क्लास कार्यान्वयन का हिस्सा हैं। एक प्रमुख '_' के साथ आंतरिक कार्यान्वयन वाले लोगों को उपसर्ग करें। यह पाइथन चेतावनी संकेत है कि यदि कार्यान्वयन में परिवर्तन होता है, तो यह चर भी बदल सकता है या पूरी तरह से चला भी सकता है। अन्यथा आपको कार्यान्वयन का ज्ञान आपकी कक्षा से लीक हो जाएगा, जिससे बाद में बदलना मुश्किल हो जाएगा।
पॉलएमसीजी

8
@ निक डी: मुझे नहीं लगता कि पायथन में गति अनुकूलन करने के लिए एक्सेसर्स सही जगह हैं।
wrar

1
@ निक डी: मेरा मतलब है, यह एक व्याख्या की गई भाषा है जो पठनीयता को प्रोत्साहित करती है, प्रदर्शन नहीं, इसलिए एक कार्यक्रम में अनुकूलन के लिए बहुत बेहतर स्थान होंगे।
18

2
@Paul: यह है नहीं एक आंतरिक गुण जब तक कि यह एक या दो प्रमुख अंडरस्कोर द्वारा नामित है (प्रथम रूप में आम तौर पर करता है उत्तरार्द्ध के रूप में पसंद किया जाता पायथन के असामान्य नाम mangling के साथ)। यदि आप डॉक्स नहीं लिखना चाहते हैं और यह समस्या आपको परेशान करती है, तो सभी उदाहरण विशेषताओं के लिए डिफ़ॉल्ट रूप से _name का उपयोग करें।

113

अजगर में, आप केवल विशेषता को सीधे एक्सेस कर सकते हैं क्योंकि यह सार्वजनिक है:

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

यदि आप विशेषता की पहुंच या परिवर्तन पर कुछ करना चाहते हैं, तो आप गुणों का उपयोग कर सकते हैं :

class MyClass:

    def __init__(self):
        self._my_attribute = 0

    @property
    def my_attribute(self):
        # Do something if you want
        return self._my_attribute

    @my_attribute.setter
    def my_attribute(self, value):
        # Do something if you want
        self._my_attribute = value

महत्वपूर्ण रूप से, क्लाइंट कोड समान रहता है।


30

यहाँ है जो Guido van Rossum प्रोग्रामिंग के मास्टरमाइंड में उसके बारे में कहते हैं

"भाषा से लड़ने" का क्या मतलब है?

Guido: आमतौर पर इसका मतलब है कि वे अपनी आदतों को जारी रखने की कोशिश कर रहे हैं जो एक अलग भाषा के साथ अच्छी तरह से काम करते हैं।

[...] लोग सब कुछ एक वर्ग में बदल देंगे, और हर एक्सेस को एक एक्सेसर विधि में बदल देंगे,
जहां वह वास्तव में पायथन में करने के लिए एक बुद्धिमान चीज नहीं है; आपके पास अधिक वर्बोज़ कोड होगा जो
डीबग करना कठिन है और बहुत धीमा चलता है। आप अभिव्यक्ति जानते हैं "आप किसी भी भाषा में फोरट्रान लिख सकते हैं?" आप जावा को किसी भी भाषा में भी लिख सकते हैं।


14

नहीं, यह अस्वाभाविक है। आम तौर पर स्वीकृत तरीका सामान्य डेटा विशेषता का उपयोग करना और उन लोगों को प्रतिस्थापित करना है जो गुणों के साथ अधिक जटिल प्राप्त / सेट तर्क की आवश्यकता होती है।


13
+1: "हम यहां सभी वयस्क हैं"। कोड दिखाई दे रहा है। "निजी" और "गेट्टर / सेटर" सभी कोड देखे जाने पर कोई मूल्य नहीं बनाते हैं।
एल।

7

आपके प्रश्न का संक्षिप्त उत्तर नहीं है, आपको जरूरत पड़ने पर गुणों का उपयोग करना चाहिए। रयान टैमियोको अपने लेख गेटर्स / सेटर्स / फॉक्सर्स में लंबे उत्तर प्रदान करता है

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


5

आपका अवलोकन सही है। यह पायथन प्रोग्रामिंग की सामान्य शैली नहीं है। विशेषताएँ सभी सार्वजनिक हैं, इसलिए आप उन्हें किसी भी ऑब्जेक्ट की विशेषताओं के साथ (जैसे, सेट, हटाएं) एक्सेस करते हैं (उनके पास केवल कक्षाएं या उदाहरण नहीं हैं)। जब जावा प्रोग्रामर पायथन सीखते हैं तो यह बताना आसान होता है क्योंकि उनका पायथन कोड पायथन सिंटैक्स का उपयोग करके जावा जैसा दिखता है!

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

एक दिलचस्प डेमो के रूप में, कोर पायथन प्रोग्रामिंग (अध्याय 13, खंड 13.16) में, मैं वर्णनकर्ताओं का उपयोग करके मेमोरी में मेमोरी के बजाय डिस्क को स्टोर करने के लिए विवरणों का उपयोग करने के उदाहरण के साथ आया था !! हाँ, यह स्थायी भंडारण का एक अजीब रूप है, लेकिन यह करता है कि तुम क्या संभव है का एक उदाहरण दिखाते हैं!

यहां एक और संबंधित पोस्ट है जो आपको उपयोगी लग सकती है: अजगर: कई गुण, एक सेटर / गेट्टर


0

मैं उस उत्तर के लिए यहाँ आया था (दुर्भाग्य से मैं नहीं कर सका)। लेकिन मुझे एक काम और भी मिला जहाँ। यह नीचे कोड प्राप्त करने के लिए वैकल्पिक हो सकता है ।
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
यह सिर्फ एक वर्कअराउंड है । उपरोक्त अवधारणा का उपयोग करके आप आसानी से पाई में भी / सेट कार्यप्रणाली प्राप्त कर सकते हैं।


-10

हमारे शिक्षक ने कक्षा पर एक उदाहरण दिखाया जिसमें बताया गया है कि हमें एक्सेसर कार्यों का उपयोग कब करना चाहिए।

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()

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

7
वास्तव में प्रश्न का उत्तर नहीं देने के अलावा, इस उत्तर में प्रयुक्त उदाहरण आक्रामक है। यह दावा कि आपके शिक्षक ने इसका इस्तेमाल किया है, यह उसके लिंगवाद को सही नहीं ठहराता है।
ताउजेन

मुझे संदेह है कि यह कामुकता को दर्शाता है, केवल आपका भोलापन। मेरी दादी की पीढ़ी में कई महिलाओं ने मजाक में कहा कि उनकी उम्र वास्तव में कुछ साल की थी। इसके अलावा इसका उत्तर से कोई लेना देना नहीं है।
जोहान स्नोगोसे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.