2009-05-21 17 views
9

मुझे याद है कि एक बिंदु पर, it was said that Python is less object oriented than Ruby, रूबी में, सब कुछ एक वस्तु है। क्या यह पाइथन के लिए भी बदल गया है? क्या नवीनतम पायथन अधिक ऑब्जेक्ट पिछले संस्करण की तुलना में उन्मुख है?क्या पाइथन अधिक ऑब्जेक्ट उन्मुख में बदल गया है?

+7

पायथन में, सब कुछ एक वस्तु है। आपने किस स्रोत को पढ़ा? क्या आप एक यूआरएल या उद्धरण प्रदान कर सकते हैं? –

+5

@ एसएलॉट - वह सही है; वास्तव में, रुबी "के बारे में" पृष्ठ अभी भी रूबी की उत्पत्ति के रूप में बताता है।मैटज़ को यह कहते हुए उद्धृत किया गया है: "मैं एक स्क्रिप्टिंग भाषा चाहता था जो पर्ल की तुलना में अधिक शक्तिशाली थी, और पायथन से अधिक ऑब्जेक्ट उन्मुख था।" http://www.ruby-lang.org/en/about/ –

+0

मेरे पास है एक ही धारणा। पाइथन अधिक "संरचित" और रूबी अपनी स्थापना के बाद शुद्ध ओओ होने के लिए पैदा हुए थे। लेकिन मैं नहीं बता सकता .. – OscarRyz

उत्तर

40

जियान लिन - जवाब है "हाँ", पायथन अधिक वस्तु है जब मैटज़ ने फैसला किया कि वह रुबी बनाना चाहता है, और दोनों भाषाओं में अब "सबकुछ एक वस्तु है" की ओर उन्मुख है। वापस जब पायथन छोटा था, तारों और संख्याओं जैसे "प्रकार" विधियों की कमी थी, जबकि "ऑब्जेक्ट्स" को "कक्षा" कथन (या जानबूझकर सी एक्सटेंशन मॉड्यूल में कक्षा बनाने के द्वारा) बनाया गया था और थोड़ा कम कुशल था लेकिन समर्थन किया विधियों और विरासत। 1 99 0 के दशक के शुरुआती दिनों में, जब एक तेज़ 386 एक बहुत अच्छी मशीन थी, तो इस समझौता को समझ में आया। लेकिन पाइथन 2.2 (2001 में जारी) में प्रकार और वर्ग एकीकृत किए गए थे, और स्ट्रिंग्स को विधियां मिल गईं और हाल ही में पाइथन संस्करणों में, उपयोगकर्ता भी उनसे उपclass कर सकते हैं।

तो: पाइथन निश्चित रूप से एक समय में कम ऑब्जेक्ट उन्मुख था; लेकिन, जहां तक ​​मुझे पता है, उन पुराने बाधाओं में से हर एक अब चला गया है।

यहाँ एकीकरण कि जगह ले ली के लिए मार्गदर्शिका दी गई है:

http://www.python.org/download/releases/2.2/descrintro/

स्पष्टीकरण: शायद मैं यह और भी सीधे शब्दों में कर सकते हैं: अजगर में, सब कुछ हमेशा एक वस्तु किया गया है; लेकिन कुछ बुनियादी प्रकार के ऑब्जेक्ट (इनट्स, स्ट्रिंग्स) एक बार "अलग-अलग नियम" द्वारा खेले जाते हैं जो ओओ प्रोग्रामिंग विधियों (जैसे विरासत) को उनके साथ इस्तेमाल करने से रोकते हैं। अब तय किया गया है।यहां एक और प्रतिक्रिया में वर्णित लेन() विधि शायद एकमात्र चीज है जो मेरी इच्छा है कि गिडो पाइथन 3.0 में अपग्रेड में बदल गया हो। लेकिन कम से कम उसने मुझे शब्दकोश की समझ दी, इसलिए मैं बहुत जोर से शिकायत नहीं करूंगा। :-)

+0

क्या गिडो ने कभी भी एक कारण दिया था कि उसने 3.0 में लेन() विधि क्यों छोड़ी? –

+0

हां, कहीं एक लेख है। असल में उनकी रीजनिंग यह थी कि मेरी_list.len() से पढ़ने के लिए लेन (my_list) अधिक straigthforward है। – nikow

+6

@ नीमो, मूल रूप से उन्होंने कहा कि लेन (एक्स) को एक int वापस करने की गारंटी है, जबकि x.len() की ऐसी कोई गारंटी नहीं है। और, वह मूल रूप से जिस तरह से बेहतर दिखता है उसे पसंद आया। (ईमेल मिला: http://mail.python.org/pipermail/python-dev/2008- जनवरी_76575.html http://mail.python.org/pipermail/python-dev/2008- जनवरी 0676612। एचटीएमएल) – JimB

12

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

len(some_list) 

मैं एक bikeshed argument मानते हैं। यह वास्तव में अनुवाद करता है (लगभग सीधे) यह है:

some_list.__len__() 

जो पूरी तरह ऑब्जेक्ट उन्मुख है। मुझे लगता है कि रुबीस्टिस्ट थोड़ा उलझन में पड़ सकते हैं क्योंकि आम तौर पर ऑब्जेक्ट उन्मुख होने पर डॉट सिंटैक्स का उपयोग करना शामिल है (उदाहरण के लिए object.method())। हालांकि, अगर मैं रूबीवादियों के तर्कों को गलत समझता हूं, तो मुझे बताने में संकोच न करें।

इस के ऑब्जेक्ट-ओरिएंटेशन के बावजूद, इस तरह से लेन का उपयोग करने का एक फायदा है। एक बात जो मुझे हमेशा कुछ भाषाओं के बारे में नाराज करती है, उसे याद रखना होगा कि किसी विशेष वस्तु के लिए some_list.size() या some_list.length() या some_list.len का उपयोग करना है या नहीं। पायथन का तरीका है

+2

क्यों नहीं ?len() सीधे सूची से बाहर क्यों नहीं? मुझे लगता है कि आप वाक्यविन्यास से ओओ डिज़ाइन को पूरी तरह से तलाक नहीं दे सकते हैं, क्योंकि बड़ी संख्या में सिंटैक्स आपके कोड प्रतिमान को परिभाषित करता है। some_list.len() ओओ है क्योंकि आप सूची के बारे में एक ऑब्जेक्ट के रूप में सोच रहे हैं जो आपको बताएगा कि इसकी लंबाई क्या है। लेन (some_list) ओओ नहीं है, भले ही यह कवर के तहत अनुवाद करता है। –

+9

क्षमा करें। सिंटेक्स और ओओ के पास एक दूसरे के साथ कुछ लेना देना नहीं है। पायथन वस्तुओं में गैर-ऑब्जेक्ट सिंटैक्स हो सकता है। वे अभी भी वस्तुओं हैं। –

+0

+1 यह एक बेहतर उत्तर है। –

2

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

ऑब्जेक्ट्स डेटा के लिए पायथन का अमूर्तता है। पाइथन प्रोग्राम में सभी डेटा वस्तुओं या वस्तुओं के बीच संबंधों द्वारा दर्शाया जाता है। (एक मायने में, और एक के वॉन न्यूमैन के मॉडल के लिए conformance में "संग्रहीत कार्यक्रम कंप्यूटर," कोड भी वस्तुओं का प्रतिनिधित्व करती है।) http://docs.python.org/reference/datamodel.html

2

यह एक गलत विश्वास है।

अधिक गहराई से विवरण के लिए यहां अपने पिछले जवाब देखें:

Is everything an object in python like ruby?

तो क्यों .len का खुलासा नहीं() सीधे सूची के बंद? मुझे लगता है कि आप वाक्यविन्यास से ओओ डिज़ाइन को पूरी तरह से तलाक नहीं दे सकते हैं, क्योंकि बड़ी संख्या में सिंटैक्स आपके कोड प्रतिमान को परिभाषित करता है। some_list.len() ओओ है क्योंकि आप सूची के बारे में एक ऑब्जेक्ट के रूप में सोच रहे हैं जो आपको बताएगा कि इसकी लंबाई क्या है। लेन (some_list)

.len() सीधे सूची से बाहर उपलब्ध है। यह __len __() के रूप में उपलब्ध है। लेन() एक कार्य वस्तु है। आप डीआईआर (लेन) के साथ अपने सभी तरीकों को देख सकते हैं। जबकि मुझे नहीं पता कि क्यों गिडो ने __len __() विधि को लंबे समय तक बनाने का फैसला किया, यह इस तथ्य को नहीं बदलेगा कि वे सभी अभी भी वस्तुएं हैं।

+0

प्रत्यक्ष उत्तर के लिए धन्यवाद। हालांकि मैं __method__ को सीधे पाइथन में निराश कर रहा था क्योंकि __ निजी के लिए शॉर्टेंड था। मुझे लगता है कि मैं बस कुछ और के साथ __ उलझन में हूँ। –

+0

आह __method __method__ से अलग है, पूर्व निजी (अप्रशिक्षित) है और बाद वाला "पूर्व परिभाषित व्यवहार के साथ विशेष सिस्टम फ़ंक्शन" है। –

7

हालांकि यह सही उत्तर नहीं है ... आप पाइथन को कम या ज्यादा ओओ क्यों देखते हैं? पायथन के बारे में अच्छी बात यह है कि यह पायथनिक है, ऑब्जेक्ट उन्मुख या funcitonal या जो भी प्रतिमान इस समय फैशनेबल है! :-)

मैंने जावा और ऑब्जेक्ट ओरिएंटेशन के साथ प्रोग्राम करना सीखा, लेकिन अब मैं इसके बारे में कोई जानकारी नहीं देता क्योंकि मुझे पता है कि ओओपी सभी समस्याओं का समाधान नहीं है (वास्तव में, कोई भी प्रतिमान नहीं है)।

देखें:

Why was python created in the first place::

+1

कि ओओपी फड कभी नहीं टिकेगा। यह तीन दशकों से क्या हुआ है? – Glenn

1

मैं एक ही "धारणा" शायद इस से ली गई है

यह मेरे लिए हुआ है कि एबीसी की तरह एक वाक्य रचना के साथ एक पटकथा भाषा [...] की जरूरत

An Interview with the Creator of Ruby:

को भरना था "मैं एक पटकथा भाषा चाहता था जो पर्ल से अधिक शक्तिशाली था, और पाइथन

से अधिक ऑब्जेक्ट उन्मुख 210

मुझे पता है कि धारणा वास्तविकता के समान नहीं है। पाइथन और रूबी दोनों महान प्रोग्रामिंग भाषाएं हैं और दोनों बहुत ओओ हैं।

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