2011-07-09 9 views
7

मैं जावा पृष्ठभूमि से हूं। मैं आधिकारिक पायथन ट्यूटोरियल के माध्यम से जा रहा हूं लेकिन पाइथन स्रोत फ़ाइल नामों और कक्षाओं के संबंध में जानकारी नहीं ढूंढ पा रहा हूं।कक्षा का नाम और फ़ाइल का नाम

जावा में, फ़ाइल का नाम मुख्य श्रेणी के नाम और .java एक्सटेंशन जैसा ही है। पायथन में क्या मामला है? आधिकारिक ट्यूटोरियल के उदाहरणों में, वे कई कक्षाएं लिख रहे हैं और फ़ाइल नाम का कोई उल्लेख नहीं है। मैं तरह खो गया हूँ।

मेरे पास test_pie.py नामक फ़ाइल नाम है। सामग्री है-

class ListTest: 

    list1 = [2, 'a', 'ab', 'c', 'aa', 0] 

    list2 = ['b', list1[-2:-5]] 

    def PrintList(self): 
     print list1 
     print list2 

List1 और List2 के लिए: मैं मिल-

अपरिभाषित चर: सूची List1 में मिला: test_pie

अपरिभाषित चर: सूची List2 मिले पर: test_pie

+2

आपको यहां कई प्रश्न हैं। आप किसको उत्तर देना चाहते हैं? –

+0

मैंने कोड स्निपेट डाला क्योंकि मैं फ़ाइल नाम और वर्ग नाम विसंगतियों के कारण यह सोच रहा था।संपादन के बाद, मैंने आपका जवाब देखा (यह तेज़ था)। मुझे आपका जवाब पसंद आया। यह स्पष्ट था। –

+0

कोड स्निपेट के पास इसके पहले किसी भी प्रश्न से कोई लेना देना नहीं है। –

उत्तर

7

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

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

आपका उदाहरण कोड/समस्या इससे संबंधित नहीं है, यह किसी दिए गए फ़ाइल के अंदर स्कोपिंग का विषय है। कक्षाओं का अपना गुंजाइश है, लेकिन आप इस तरह के तरीकों से युक्त वर्ग के वर्ग चर का उपयोग नहीं कर सकते हैं और नहीं करना चाहिए - यह उप-वर्ग में एक नए मान सेट के लिए कोड को अनजान कर देगा। इसके बजाए, आप कक्षा वर्गों का उपयोग करते हैं (वैसे, आपको http://dirtsimple.org/2004/12/python-is-not-java.html को उचित रूप से पढ़ना चाहिए) या इस तथ्य का उपयोग करें कि उदाहरण कक्षा के सभी सदस्यों को प्राप्त करते हैं और इसे self. के साथ उपसर्ग करते हैं।

+0

यह बहुत स्पष्ट है। आपके समय के लिए शुक्रिया। इसकी प्रशंसा करना। –

+1

उदाहरण कक्षा के गुणों ("सदस्यों" के लिए पाइथोनिक नाम) "वारिस" नहीं करते हैं; बल्कि, ऑब्जेक्ट में किसी विशेषता को देखने का प्रयास करने से कक्षा में देखने की कोशिश भी होगी यदि ऑब्जेक्ट में कोई नहीं है। इसका अर्थ यह है कि यदि इस तरह से 'list1' का उपयोग किया जाता है, तो यह कक्षा के उदाहरणों के बीच प्रभावी रूप से ** साझा ** होगा। खबरदार। –

+0

@ करल: हाँ, यह निश्चित रूप से मेरा मतलब था लेकिन सही तरीके से व्यक्त करने में असफल रहा। स्पष्टीकरण के लिए धन्यवाद। – delnan

8

पायथन में एक फ़ाइल में मॉड्यूल है, जो जावा में नेमस्पेस के समान है, इसलिए आपके पास एक ही नामस्थान के लिए सभी कक्षाएं होंगी एएम फाइल

2

जावा पायथन नहीं है। पायथन जावा नहीं है। कई मतभेद हैं जिन्हें आपने अभी यहां खुलासा किया है; आप अपेक्षा से अधिक।

जावा में, फ़ाइल का नाम मुख्य श्रेणी नाम और .java एक्सटेंशन जैसा ही है। पायथन में क्या मामला है?

विपरीत: फ़ाइल का नाम किसी भी चीज़ के समान नहीं है।

आधिकारिक ट्यूटोरियल के उदाहरणों में, वे कई कक्षाएं लिख रहे हैं और फ़ाइल नाम का कोई उल्लेख नहीं है। मैं तरह खो गया हूँ।

क्योंकि इससे कोई फर्क नहीं पड़ता। (ध्यान दें कि जावा में आपके पास प्रति फ़ाइल एक से अधिक कक्षाएं हो सकती हैं, जब तक कि संबंधित नाम के साथ केवल public हो।अजगर में, public वास्तव में इस तरह के रूप में मौजूद नहीं है)

List1 और List2 के लिए:। मैं मिल-

अपरिभाषित चर: List1 सूची मिली है: test_pie

अपरिभाषित चर: List2 सूची मिले at: test_pie

ऐसा इसलिए है क्योंकि उन विशेषताओं (जिसे आप जावा में "फ़ील्ड" कहते हैं) कक्षा से संबंधित हैं, ऑब्जेक्ट नहीं।

विधि (जावा के समान नाम) अभी भी पाइथन-सोच में कक्षा से संबंधित है, लेकिन इसे किसी ऑब्जेक्ट के माध्यम से एक्सेस किया जाता है। यही कारण है कि आपको पाइथन विधियों के लिए एक स्पष्ट self पैरामीटर की आवश्यकता है: क्योंकि my_object.do_something(x, y, z) का पूर्ण रूप से MyClass.do_something(my_object, x, y, z) में अनुवाद किया गया है (अधिक या कम; "बाध्यकारी" वाले दृश्यों के पीछे कुछ चालबाजी है, जो आपको my_object.do_something किसी ऑब्जेक्ट के रूप में इलाज करने की अनुमति देती है। हाँ, पायथन में , सब कुछ, एक वस्तु है भी कार्यों। और तुम सोचा था कि जावा OO। हा था।)

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

तो शायद आप अब तक सोच रहे हैं बस आप अपनी कक्षा के बजाय वास्तविक पायथन ऑब्जेक्ट में गुण कैसे प्राप्त करते हैं। उत्तर: आप बस उन्हें असाइन करें। यदि आप कोई प्रतिबंध नहीं रखते हैं, तो आप उन्हें किसी भी नाम से किसी भी समय असाइन कर सकते हैं। वस्तु मूल रूप से सिर्फ एक शब्दकोश है। यदि आप Java * स्क्रिप्ट * (जावा से पूरी तरह से संबंधित एक भाषा) से परिचित हैं, तो यह वैसे ही काम करता है। हालांकि, पागलपन को नियंत्रित करने के लिए, विशेष रूप से नामित विधि __init__ में प्रारंभिक विशेषता मान असाइन करना सामान्य है, जिसे ऑब्जेक्ट के निर्माण पर तुरंत (यदि पाया जाता है) कहा जाता है (लेकिन यह सामान्य रूप से एक कन्स्ट्रक्टर नहीं है भावना; उस भूमिका को __new__ द्वारा खेला जाता है, लेकिन आपको वास्तव में पाइथन में वास्तव में इसकी आवश्यकता नहीं होती है), और उसके बाद केवल नए गुण बनाने के बजाय सेट किए गए गुणों को फिर से असाइन करें।

आप प्रतिबंध सेट कर सकते हैं यदि आप एक नई शैली वर्ग है, एक विशेष रूप से के लिए एक मूल्य निर्दिष्ट करके (3.x में स्वत: आप में निर्मित प्रकार object से कम से कम परोक्ष रूप से वारिस चाहिए 2.x में) नामित वर्ग विशेषता __slots__ कहा जाता है। यह तारों की एक सूची होनी चाहिए जो मान्य पहचानकर्ता नाम हैं। इस जगह के साथ, पायथन (ए) वस्तुओं के लिए डेटा के आंतरिक भंडारण को अनुकूलित करने के लिए जानकारी का उपयोग करेगा; (बी) ऑब्जेक्ट में अन्य नामों के साथ विशेषताओं को जोड़ने से आपको अनुमति नहीं देता है; (सी) ऑब्जेक्ट इंस्टेंस के लिए विशेष __dict__ विशेषता के निर्माण को दबाएं जो मानों को गुणित करने के लिए एक शब्दकोश मैपिंग विशेषता नाम है। (और आपने सोचा था कि जावा समर्थित प्रतिबिंब। हां।) यह नहीं स्वचालित रूप से नामित विशेषताओं के लिए कोई मान असाइन करेगा; उन्हें सौंपा जाने से पहले उन्हें एक्सेस करने का प्रयास raise AttributeError होगा।