2009-05-14 11 views
37

किसी अन्य स्टैक ओवरफ़्लो प्रश्न पर एक टिप्पणी में कहा गया है कि पायथन बस रूबी की तरह था, क्योंकि यह "सबकुछ एक वस्तु है" से संबंधित है, और पाइथन में सब कुछ रूबी की तरह एक वस्तु थी।क्या सब कुछ अजगर की तरह अजगर में एक वस्तु है?

क्या यह सच है? क्या सब कुछ अजगर की तरह अजगर में एक वस्तु है?

इस संबंध में दो अलग-अलग कैसे हैं या वे वास्तव में वही हैं? उदाहरण के लिए, आप एक नंबर लेने के लिए और गहरे लाल रंग का सामान मैं की तरह देखा है कर सकते हैं:

y = 5.plus 6 

कि अजगर में एक ही तरह से किया जा सकता है?

+0

जब आप कहते हैं "ऑब्जेक्ट" क्या आपका मतलब ओओपी शब्दावली है? दोनों अजगर और रूबी बल्कि नौसिखिया भाषाएं हैं, इसलिए आप मुझसे अधिक समझदारी करते हैं यदि आप वास्तव में इसे किसी विशेष भाषा से अलग किए गए स्मॉलटाक, सी ++ या ओओपी-पैराडिग (सिद्धांत) से संबंधित पूछेंगे: "क्या पाइथन शुद्ध ओओ भाषा है, यानी प्रत्येक (डेटा) प्रकार एक वस्तु (या वस्तुओं की एक वर्ग) है? " http://en.wikipedia.org/wiki/Object-oriented_programming –

उत्तर

58

DiveIntoPython - Everything Is an Object

Everything in Python is an object, and almost everything has attributes and methods. All functions have a built-in attribute __doc__ , which returns the doc string defined in the function's source code. The sys module is an object which has (among other things) an attribute called path. And so forth.

Still, this begs the question. What is an object? Different programming languages define “object” in different ways. In some, it means that all objects must have attributes and methods; in others, it means that all objects are subclassable. In Python, the definition is looser; some objects have neither attributes nor methods (more on this in Chapter 3), and not all objects are subclassable (more on this in Chapter 5). But everything is an object in the sense that it can be assigned to a variable or passed as an argument to a function (more in this in Chapter 4).

Ruby Docs - To Ruby From Python

As with Python, in Ruby,... Everything is an object

तो वहाँ आप रूबी की अपनी वेबसाइट से यह राशि: में अजगर कुछ एक ऑब्जेक्ट है।

+2

+1 अच्छी तरह से डाल दिया। एक रूबीस्ट के रूप में, मैं तर्क के पक्ष में "वस्तुओं के पास विधियों" की ओर रुख करता हूं, लेकिन "सब कुछ एक तर्क के रूप में पारित किया जा सकता है" तर्क अच्छी तरह से रखा जाता है (और मुझे लगता है कि पाइथोनिस्टा दृष्टिकोण को बेहतर ढंग से प्रतिबिंबित करता है) – rampion

+22

"लेकिन सबकुछ एक है इस अर्थ में ऑब्जेक्ट करें कि इसे एक चर के लिए असाइन किया जा सकता है या किसी फ़ंक्शन के लिए तर्क के रूप में पारित किया जा सकता है (अध्याय 4 में इसमें अधिक)। " इससे मुझे कोई समझ नहीं आती है। क्या यह जावा int ऑब्जेक्ट्स नहीं बनायेगा? –

+1

@JamesMcMahon हाँ, आप सही हैं !! उत्तर के ऊपर सवाल का जवाब नहीं दिया !! अगर हम गिडो के [ब्लॉग] (http://python-history.blogspot.in/2009/02/first-class-everything.html) पढ़ते हैं, तो यह कहता है: 'पायथन के लिए मेरे लक्ष्यों में से एक यह बनाना था ताकि सभी वस्तुओं "प्रथम श्रेणी" थे। इसके द्वारा, मेरा मतलब था कि मैं सभी वस्तुओं को चाहता था जिन्हें भाषा में नामित किया जा सकता है (उदाहरण के लिए, पूर्णांक, तार, कार्य, कक्षाएं, मॉड्यूल, विधियां इत्यादि) समान स्थिति के लिए। यही है, उन्हें सूचियों में रखा गया है, जो सूचियों में रखा गया है, शब्दों में संग्रहीत, तर्क के रूप में पारित किया गया है, और आगे भी। ' – overexchange

1

हाँ, जहां तक ​​मुझे पता है कि सब कुछ पाइथन में एक वस्तु है। निश्चित रूप से आदिम और अंतर्निहित प्रकार (int, long, str, float, आदि) को उप-वर्गीकृत किया जा सकता है - और वास्तव में प्रकार स्वयं वस्तुएं हैं। कार्य वस्तुएं हैं, कक्षाएं वस्तुएं हैं, यहां तक ​​कि कोड ब्लॉक भी एक अर्थ में वस्तुएं हैं ... मैं पाइथन में कुछ भी नहीं सोच सकता जिसे किसी ऑब्जेक्ट के रूप में नहीं माना जा सकता है।

+0

एक वस्तु है '# टिप्पणी'? यह आलोचना नहीं है; मैं ईमानदारी से उत्सुक हूँ। – ocertat

+1

@ocertat नहीं, कम से कम इस अर्थ में नहीं, मुझे लगता है कि आपका मतलब है। टिप्पणियां स्रोत कोड की एक विशेषता है, लेकिन कार्यक्रम के स्वयं नहीं। जब पाइथन पार्सर चलता है, तो यह किसी टिप्पणी में किसी भी पाठ को छोड़ देता है और उस पर कार्य नहीं करता है।(हालांकि, मानक लाइब्रेरी में एक पायथन स्रोत कोड पार्सर है, और यदि आप इसे स्रोत फ़ाइल पर टिप्पणियों के साथ चलाते हैं, तो यह उन ऑब्जेक्ट्स का उत्पादन कर सकता है जो उन टिप्पणियों से मेल खाते हैं - अगर ऐसा होता है तो मुझे ऑफहैंड याद नहीं है।) –

17

अपने दूसरे सवाल का जवाब में, हां:

>>> (1).__add__(2) 
3 
+2

हां। या यहां तक ​​कि '1। __add __ (2) '(अंतरिक्ष को नोट करें)। फ्लोट के लिए भी काम करेगा: '1 ..__ __ (2)' जोड़ें। –

+2

@ डीएफ: आपका पहला उदाहरण, जो "1." के बाद एक स्थान का उपयोग करता है, मेरे लिए 3.2.3 => सिंटेक्स त्रुटि: अमान्य वाक्यविन्यास –

+0

स्थान 1 और डॉट के बीच होना चाहिए: डी ' 1 .__ जोड़ें __ (2) ' –

16

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

+1

हां, लेकिन यहां तक ​​कि छोटे टॉक पर भी, जहां 'अगर' ब्लॉक की विधि है (रूबी पर प्रो/लैम्ब्डा, पाइथन पर लैम्ब्डा, भाषा-अज्ञेय लोगों के लिए बंद), और सबकुछ एक वस्तु है, इसके कीवर्ड सही, झूठी, शून्य, स्वयं, सुपर और यह कॉन्टैक्स्ट। निश्चित रूप से, वे छद्म-चर के समान हैं ... –

30

जबकि सब कुछ पायथन में एक वस्तु है, यह नामों को हल करने और वस्तुओं के साथ बातचीत करने के दृष्टिकोण में रुबी से अलग है।

उदाहरण के लिए, रूबी आपको उस कार्यक्षमता का खुलासा करने के लिए ऑब्जेक्ट बेस क्लास पर 'to_s' विधि प्रदान करता है, पाइथन इसे स्ट्रिंग प्रकार में एकीकृत करता है - आप स्ट्रिंग का निर्माण करके एक प्रकार को स्ट्रिंग में कनवर्ट करते हैं इसमें से। 5.to_s के बजाय, आपके पास str(5) है।

हालांकि मूर्ख मत बनो। अभी भी पर्दे के पीछे एक विधि है - जिसके कारण इस कोड काम करता है:

(5).__str__() 

तो व्यवहार में, दो मौलिक समान हैं, लेकिन आप उन्हें अलग तरह से इस्तेमाल करते हैं। पायथन में सूचियों और टुपल्स जैसे अनुक्रमों की लंबाई काम पर इस सिद्धांत का एक और उदाहरण है - वास्तविक विशेषता विशेष नामों के तरीकों पर बनाई गई है, लेकिन एक सरल, उपयोग में आसान इंटरफेस (len फ़ंक्शन) के माध्यम से उजागर की गई है।

क्या आप अपने प्रश्न में लिखा है इस प्रकार किया जाएगा करने के लिए अजगर बराबर:

(5).__add__(6) 

अन्य अंतर यह है कि महत्वपूर्ण है कि कैसे वैश्विक कार्यों लागू किया जाता है है। पायथन में, ग्लोबल्स को एक शब्दकोश (जैसे स्थानीय हैं) द्वारा दर्शाया जाता है। इसका मतलब है कि निम्नलिखित:

globals()["foo"].__call__(5) 

इस गहरे लाल रंग का प्रभावी ढंग से करता है:

Object.foo(5) 

यह दृष्टिकोण पर एक बड़ा प्रभाव का इस्तेमाल किया गया जब

foo(5) 

अजगर में इस के बराबर है दोनों भाषाओं में कोड लिखना। रूबी लाइब्रेरी ऑब्जेक्ट्स जैसे मौजूदा प्रकारों के तरीकों के अतिरिक्त बढ़ने लगती हैं, जबकि पाइथन लाइब्रेरी किसी दिए गए मॉड्यूल पर वैश्विक कार्यों को जोड़ने के माध्यम से बढ़ती हैं।

+0

"पाइथन पुस्तकालयों को किसी दिए गए मॉड्यूल में वैश्विक कार्यों के अतिरिक्त बढ़ने लगता है।" यह वास्तव में सही नहीं है। globals() ["foo"] एक वस्तु देता है। __call__ एक विधि है, न कि वैश्विक कार्य। आप globals() ["__ call__"] – Unknown

+0

नहीं कर सकते हैं मेरा मुद्दा यह था कि foo मॉड्यूल का एक तरीका नहीं है। यह मॉड्यूल की एक विशेषता है, जो कॉल करने योग्य होता है, और इसे आयात करने से इसे ग्लोबल्स() में भी जोड़ा जाता है। __call__ एक विधि है, हां। रूबी में, foo तुलना में ऑब्जेक्ट का एक तरीका है। –

+2

मैं समझने की कोशिश कर रहा था कि मैं "1" क्यों कर सकता हूं .__ eq __ ("2") => गलत, लेकिन 1 नहीं .__ eq __ (2) => सिंटेक्स त्रुटि: अमान्य वाक्यविन्यास। आपका उत्तर दिखाता है कि मुझे ब्रांड्स की आवश्यकता है, उदाहरण के लिए, (1) .__ eq __ (2)। आश्चर्यजनक रूप से, @ RichieHindle 1 ..__ __ (2) जोड़ता है, लेकिन एक ही अवधि के साथ नहीं। ऐसा क्यों है? –

0

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

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