जावा में (विभिन्न कारणों से) गेट / सेट का उपयोग करना एक आम बात है, लेकिन मैं शायद ही इसका उपयोग करने वाले पायथन कोड को देखता हूं।
आप पायथन में विधियों का उपयोग / सेट करने से क्यों बचते हैं?
जावा में (विभिन्न कारणों से) गेट / सेट का उपयोग करना एक आम बात है, लेकिन मैं शायद ही इसका उपयोग करने वाले पायथन कोड को देखता हूं।
आप पायथन में विधियों का उपयोग / सेट करने से क्यों बचते हैं?
जवाबों:
अच्छा लिंक: अजगर जावा नहीं है :)
जावा में, आपको गेटर्स और सेटर का उपयोग करना पड़ता है क्योंकि सार्वजनिक क्षेत्रों का उपयोग करने से आपको गेटर्स और सेटर का उपयोग करने के लिए वापस जाने और बाद में अपना मन बदलने का कोई अवसर नहीं मिलता है। तो जावा में, आप आगे के रास्ते से बाहर निकलने के रूप में अच्छी तरह से प्राप्त कर सकते हैं। पायथन में, यह मूर्खतापूर्ण है, क्योंकि आप एक सामान्य विशेषता के साथ शुरू कर सकते हैं और किसी भी समय अपने मन को बदल सकते हैं, बिना किसी वर्ग के ग्राहकों को प्रभावित किए। इसलिए, गेटर्स और सेटर्स न लिखें।
अजगर में, आप केवल विशेषता को सीधे एक्सेस कर सकते हैं क्योंकि यह सार्वजनिक है:
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
महत्वपूर्ण रूप से, क्लाइंट कोड समान रहता है।
यहाँ है जो Guido van Rossum प्रोग्रामिंग के मास्टरमाइंड में उसके बारे में कहते हैं
"भाषा से लड़ने" का क्या मतलब है?
Guido: आमतौर पर इसका मतलब है कि वे अपनी आदतों को जारी रखने की कोशिश कर रहे हैं जो एक अलग भाषा के साथ अच्छी तरह से काम करते हैं।
[...] लोग सब कुछ एक वर्ग में बदल देंगे, और हर एक्सेस को एक एक्सेसर विधि में बदल देंगे,
जहां वह वास्तव में पायथन में करने के लिए एक बुद्धिमान चीज नहीं है; आपके पास अधिक वर्बोज़ कोड होगा जो
डीबग करना कठिन है और बहुत धीमा चलता है। आप अभिव्यक्ति जानते हैं "आप किसी भी भाषा में फोरट्रान लिख सकते हैं?" आप जावा को किसी भी भाषा में भी लिख सकते हैं।
नहीं, यह अस्वाभाविक है। आम तौर पर स्वीकृत तरीका सामान्य डेटा विशेषता का उपयोग करना और उन लोगों को प्रतिस्थापित करना है जो गुणों के साथ अधिक जटिल प्राप्त / सेट तर्क की आवश्यकता होती है।
आपके प्रश्न का संक्षिप्त उत्तर नहीं है, आपको जरूरत पड़ने पर गुणों का उपयोग करना चाहिए। रयान टैमियोको अपने लेख गेटर्स / सेटर्स / फॉक्सर्स में लंबे उत्तर प्रदान करता है
इस सब से दूर ले जाने का मूल मूल्य यह है कि आप यह सुनिश्चित करना चाहते हैं कि कोड की हर एक लाइन का प्रोग्रामर के लिए कुछ मूल्य या अर्थ हो। प्रोग्रामिंग भाषाएं इंसानों के लिए हैं, मशीनें नहीं। यदि आपके पास ऐसा कोड है जो ऐसा दिखता है कि यह कुछ भी उपयोगी नहीं है, पढ़ना मुश्किल है, या थकाऊ लगता है, तो संभावना अच्छी है कि पायथन में कुछ भाषा सुविधा है जो आपको इसे हटाने देगी।
आपका अवलोकन सही है। यह पायथन प्रोग्रामिंग की सामान्य शैली नहीं है। विशेषताएँ सभी सार्वजनिक हैं, इसलिए आप उन्हें किसी भी ऑब्जेक्ट की विशेषताओं के साथ (जैसे, सेट, हटाएं) एक्सेस करते हैं (उनके पास केवल कक्षाएं या उदाहरण नहीं हैं)। जब जावा प्रोग्रामर पायथन सीखते हैं तो यह बताना आसान होता है क्योंकि उनका पायथन कोड पायथन सिंटैक्स का उपयोग करके जावा जैसा दिखता है!
मैं निश्चित रूप से सभी पिछले पोस्टरों से सहमत हूं, विशेष रूप से @ फिलिपिल के प्रसिद्ध लेख और @ मैक्स के लिंक पर मैक्सिमिलियानो का सुझाव है कि वर्ग (और प्राप्त करने) के मानक तरीके से अधिक जटिल कुछ भी है और गुण का उपयोग गुण (या सामान्य से भी अधिक) करने के लिए है। विशेषताओं की स्थापना और सेटिंग को अनुकूलित करने के लिए! (इसमें निजी, संरक्षित, मित्र, या जो भी नीति आप चाहते हैं, अगर आप सार्वजनिक रूप से कुछ और चाहते हैं, तो अपने स्वयं के अनुकूलित संस्करण जोड़ने में सक्षम हैं।)
एक दिलचस्प डेमो के रूप में, कोर पायथन प्रोग्रामिंग (अध्याय 13, खंड 13.16) में, मैं वर्णनकर्ताओं का उपयोग करके मेमोरी में मेमोरी के बजाय डिस्क को स्टोर करने के लिए विवरणों का उपयोग करने के उदाहरण के साथ आया था !! हाँ, यह स्थायी भंडारण का एक अजीब रूप है, लेकिन यह करता है कि तुम क्या संभव है का एक उदाहरण दिखाते हैं!
यहां एक और संबंधित पोस्ट है जो आपको उपयोगी लग सकती है: अजगर: कई गुण, एक सेटर / गेट्टर
मैं उस उत्तर के लिए यहाँ आया था (दुर्भाग्य से मैं नहीं कर सका)। लेकिन मुझे एक काम और भी मिला जहाँ। यह नीचे कोड प्राप्त करने के लिए वैकल्पिक हो सकता है ।
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
यह सिर्फ एक वर्कअराउंड है । उपरोक्त अवधारणा का उपयोग करके आप आसानी से पाई में भी / सेट कार्यप्रणाली प्राप्त कर सकते हैं।
हमारे शिक्षक ने कक्षा पर एक उदाहरण दिखाया जिसमें बताया गया है कि हमें एक्सेसर कार्यों का उपयोग कब करना चाहिए।
class Woman(Human):
def getAge(self):
if self.age > 30:
return super().getAge() - 10
else:
return super().getAge()