जबकि कारण ज्यादातर ऐतिहासिक है, वहाँ पायथन के len
में कुछ विशेषताओं कि बजाय एक समारोह के उपयोग के लिए एक विधि उचित की कर रहे हैं ।
अजगर में कुछ संचालन,, विधियों के रूप में लागू किया जाता है, उदाहरण के list.index
और dict.append
के लिए, जबकि दूसरों, callables और जादू तरीके के रूप में लागू किया जाता है, उदाहरण के str
और iter
और reversed
के लिए। दोनों समूह पर्याप्त भिन्न हैं इसलिए विभिन्न दृष्टिकोण उचित हैं:
- वे आम हैं।
str
, int
और दोस्त प्रकार हैं। यह कन्स्ट्रक्टर को कॉल करने के लिए और अधिक समझ में आता है।
- कार्यान्वयन फ़ंक्शन कॉल से अलग है। उदाहरण के लिए,
iter
__getitem__
पर कॉल कर सकता है यदि __iter__
उपलब्ध नहीं है, और अतिरिक्त तर्क का समर्थन करता है जो विधि कॉल में फिट नहीं होते हैं। उसी कारण से it.next()
को पायथन के हाल के संस्करणों में next(it)
में बदल दिया गया है - यह अधिक समझ में आता है।
- इनमें से कुछ ऑपरेटर के करीबी रिश्तेदार हैं।
__iter__
और __next__
पर कॉल करने के लिए वाक्यविन्यास है - इसे for
लूप कहा जाता है। स्थिरता के लिए, एक समारोह बेहतर है। और यह कुछ अनुकूलन के लिए बेहतर बनाता है।
- कुछ फ़ंक्शन बाकी तरीके से बाकी के समान ही हैं -
repr
str
जैसे कार्य करता है। str(x)
बनाम x.repr()
भ्रमित हो जाएगा।
- उनमें से कुछ शायद ही कभी वास्तविक कार्यान्वयन विधि का उपयोग करते हैं, उदाहरण के लिए
isinstance
।
- उनमें से कुछ वास्तविक ऑपरेटर हैं,
getattr(x, 'a')
x.a
और getattr
करने का एक और तरीका उपर्युक्त गुणों में से कई साझा करता है।
मैं व्यक्तिगत रूप से पहली समूह विधि-जैसे और दूसरा समूह ऑपरेटर-जैसे कॉल करता हूं। यह बहुत अच्छा भेद नहीं है, लेकिन मुझे उम्मीद है कि यह किसी भी तरह से मदद करता है।
यह कहकर, len
दूसरे समूह में बिल्कुल फिट नहीं है। यह पहले के संचालन के करीब है, केवल अंतर के साथ कि यह लगभग किसी भी तरह से अधिक आम है। लेकिन यह एकमात्र चीज है जो __len__
पर कॉल कर रही है, और यह L.index
के बहुत करीब है। हालांकि, कुछ मतभेद हैं। उदाहरण के लिए, __len__
को bool
जैसी अन्य सुविधाओं के कार्यान्वयन के लिए बुलाया जा सकता है, यदि विधि len
कहलाती है तो आप कस्टम len
विधि के साथ bool(x)
तोड़ सकते हैं जो पूरी तरह से अलग चीज करता है।
संक्षेप में, आपके पास ऑब्जेक्ट निर्माण के दौरान, एक विशेष फ़ंक्शन (आमतौर पर ऑपरेटर के रूप में कार्यान्वयन से अधिक करता है) के माध्यम से ऑपरेटर के माध्यम से एक्सेस किया जा सकता है, जो बहुत ही सामान्य विशेषताओं का एक सेट है, और वे सभी कुछ सामान्य लक्षण साझा करते हैं। बाकी सब एक विधि है। और len
उस नियम के अपवाद का कुछ हद तक है।
स्रोत
2011-03-05 01:37:46
मुझे लगता है कि सामान्य कारण एक है) ऐतिहासिक और ख) 'तरह LEN (कुछ)' या 'उलट()' वस्तुओं के कई प्रकार के लिए लागू होता है , लेकिन 'एपेंड()' जैसी विधि केवल अनुक्रमों पर लागू होती है, आदि –