उदाहरण के लिए अजगर प्रतीत नहीं होता।
यह सुनिश्चित करता है - यह सिर्फ परोक्ष हर वर्ग के लिए एक नया metaclass उत्पन्न नहीं करता है: यह माता पिता के वर्ग के रूप में एक ही metaclass का उपयोग करता है, या type
डिफ़ॉल्ट रूप से। पाइथन के डिजाइन दर्शन, उर्फ "पायथन" का ज़ेन, एक इंटरैक्टिव दुभाषिया के संकेत पर import this
कर कर देखा जा सकता है; यहां लागू बिंदु दूसरा है, "स्पष्ट अंतर्निहित से बेहतर है।"
पायथन 2.x में, आप निम्न संरचना के साथ एक कस्टम metaclass निर्दिष्ट करें:
class sify(metaclass=mymeta):
...
:
class sic:
__metaclass__ = mymeta
...
अजगर 3.x में, और अधिक सुंदर ढंग से, आप नामित तर्क सिंटैक्स का उपयोग करें
स्मॉलटॉक में जनरेटर की अवधारणा अवधारणा नहीं है।
पायथन के जेनरेटर प्रथम श्रेणी (आमतौर पर स्टैंडअलोन) फ़ंक्शन हैं, और स्मॉलटाक में "स्टैंडअलोन" फ़ंक्शंस की अवधारणा नहीं है - इसमें कक्षाओं के अंदर विधियां हैं। लेकिन यह निश्चित रूप iterators है - वर्ग के रूप में, निश्चित रूप से:
iterator := aCollection iterator.
[iterator hasNext] whileTrue: [iterator next doSomething].
के बाद से स्मालटाक प्रथम श्रेणी "कोड ब्लॉक" (रूबी उन्हें यह से लिया), तो आप यात्रा को पूरा, बस अन्य "नियंत्रण संरचनाओं" की तरह है एक उपयुक्त विधि करने के लिए एक कोड ब्लॉक भेज कर, और यदि आप चाहें तो आप ऐसा कर सकते सीधे संग्रह के साथ (लगता है select:
):
aCollection select: [:item | item doSomething].
स्मालटाक (और रूबी) में
तो तुम यात्रा करने के लिए कोड ब्लॉक भेज ; पाइथन चीजों को दूसरे तरीके से करता है, पुनरावृत्ति आसपास के "कॉलिंग" कोड को मूल्य भेजती है। बहुत अलग दिखता है, लेकिन अंत में "गहराई से" अलग नहीं है।
प्रथम श्रेणी कोड ब्लॉक का मतलब है कि स्मालटाक की जरूरत नहीं है और न ही "नियंत्रण संरचना" बयान और इस तरह के if
या while
के रूप में कीवर्ड हैं: वे (उचित तरीकों के तर्कों के रूप में कोड ब्लॉक भेजने बूलियन्स की जैसे ifTrue:
विधि द्वारा पूरा किया जा सकता)। (रूबी ने को के साथ प्रथम श्रेणी कोड ब्लॉक में चुनने का विकल्प चुना है; मैं कहूंगा कि पायथन [[स्पष्ट रूप से]] और स्मॉलटॉक [[implicitly]] दोनों कोशिश करते हैं, जैसे सी, "एक ही रास्ता प्रदान करना एक ऑपरेशन करने के लिए ", जबकि रुबी के पर्ल-इश स्कूल में" इसे करने के कई तरीके हैं ")।
और हालांकि दोनों dynamicly टाइप किया जा करने के लिए कहा जाता है, मेरा मानना है कि कि अजगर गतिशील विधि प्रेषण नहीं करता है। क्या यह सही है?
नहीं है, पूरी तरह से गलत है - अजगर तीव्रता से गतिशील विधि प्रेषण, चरम पर है।उदाहरण के लिए विचार करें:
for i in range(10):
myobject.bah()
अजगर अर्थ विज्ञान से, इस विधि bah
के लिए 10 लुकअप करता myobject
में - बस मामले में विधि के पिछले निष्पादन हुआ था myobject
को पूरी तरह से पुनर्गठन ही आंतरिक रूप से इतना है कि इसके वर्तमानbah
विधि पिछली एक से पूरी तरह से अलग है (प्रोग्रामर के लिए इतनी क्रूर गतिशीलता पर भरोसा करने के लिए एक बहुत ही पागल चीज हो सकती है, लेकिन पायथन इसका समर्थन करता है)। यही कारण है बनाता है:
themethod = myobject.bah
for i in range(10):
themethod()
अजगर कोड में एक आम हाथ से अनुकूलन - के बजाय पाश 10 पाश अंदर से पहले एक गतिशील देखने करता है, पैर प्रति एक (यह "निरंतर उत्थापन" का एक मामला है , क्योंकि संकलक को पाइथन के गतिशील लुकअप के चरम नियमों द्वारा स्वयं "निरंतर तह" करने से मना किया जाता है - जब तक कि यह साबित न हो कि यह निर्दोष होने की गारंटी है, और व्यवहार में ऐसा सबूत बहुत कठिन है इसलिए पाइथन कार्यान्वयन आमतौर पर परेशान नहीं होता है)।
पायथन एकीकृत नामस्थान का उपयोग करता है: विधियों किसी ऑब्जेक्ट की विशेषता किसी अन्य की तरह हैं, सिवाय इसके कि वे कॉल करने योग्य हैं। यही कारण है कि इसे कॉल किए बिना विधि को निकालने (इसे "बाध्य विधि" के रूप में जाना जाता है), इसे एक चर में संदर्भित करना (या किसी सूची या अन्य कंटेनर में इसे छेड़छाड़ करना, इसे किसी फ़ंक्शन से वापस करना), एक सादा है और उपरोक्त निरंतर-उछाल वाले उदाहरण में सरल ऑपरेशन।
स्मॉलटॉक और रूबी के पास विधियों और अन्य विशेषताओं के लिए अलग-अलग नामस्थान हैं (स्मॉलटॉक में, गैर-विधियों के गुण वस्तु के स्वयं के तरीकों के बाहर दिखाई नहीं दे रहे हैं), इसलिए "विधि निकालने" और "परिणामस्वरूप ऑब्जेक्ट को कॉल करने" के लिए अधिक आत्मनिर्भर समारोह की आवश्यकता होती है (लेकिन कुछ मामलों में प्रेषण का सामान्य मामला मामूली रूप से सरल हो सकता है - विशेष रूप से, "केवल उल्लेख" एक तर्क-कम विधि इसे स्पष्ट रूप से कॉल करती है, जबकि पाइथन में, सी की तरह, कॉलिंग को स्पष्ट रूप से कोष्ठक जोड़कर निष्पादित किया जाता है, जबकि "बस उल्लेख", अच्छी तरह से ... "बस उल्लेख करता है", इसे किसी भी प्रकार के स्पष्ट संचालन के लिए उपलब्ध कराने सहित कॉलिंग ;-)।
"मैं विशेष रूप से यह जानना चाहता हूं कि कार्यान्वयन, सिंटेक्स, एक्सटेंसिबिलिटी और फिलॉसफी में मौलिक मतभेद क्या हैं।" ठीक है, यह सब कुछ काफी है। तो उस प्रश्न का उत्तर देने का एकमात्र तरीका आपको दोनों भाषाओं को पढ़ाना है। :-) –
मैंने अब दोनों सीखा: डी –