2010-04-05 9 views
62

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

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

+0

हर किसी से ग्रीटिंग प्रतिक्रियाएं। माना जाता है कि, यह प्रश्न इस के एक ऑफशूट है http://stackoverflow.com/questions/1022970/getters-and-setters-code-smell-necessary-evil-or-cant-live-without-them-clos हालांकि, यह ऐसा लगता है कि मुझे "जे" शब्द परिप्रेक्ष्य से देख रहे लोगों की भीड़ से छेड़छाड़ की गई थी। स्वच्छता में मेरा विश्वास बहाल करने के लिए फिर से धन्यवाद ... –

+1

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

उत्तर

49

कूल लिंक: Python is not Java :)

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

+3

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

+2

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

+8

@ निक डी: मुझे नहीं लगता कि पाइथन में स्पीड ऑप्टिमाइज़ेशन करने के लिए एक्सेसर्स सही जगह हैं। – wRAR

11

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

+11

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

22

यहाँ गुइडो van Rossum कि Masterminds of Programming

में के बारे में कहते हैं कि आप "भाषा लड़" से क्या मतलब है है?

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

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

4

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

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

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

class MyClass(object): 

    def __init__(self): 
     self.my_attribute = 0 

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

आप कुछ करना चाहते हैं: Python: multiple properties, one setter/getter

91

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

यहाँ एक और संबंधित पोस्ट कि तुम उपयोगी रूप में अच्छी तरह मिल सकता है है विशेषता का उपयोग कर सकते या उत्परिवर्तन पर, आप उपयोग कर सकते हैं properties:

class MyClass(object): 

    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 

महत्वपूर्ण बात, ग उदार कोड वही रहता है।

4

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

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

-6

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

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

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

+5

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

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

  • कोई संबंधित समस्या नहीं^_^