2012-04-28 11 views
5

दोस्तों, मुझे पाइथन कक्षा में नियंत्रण प्रवाह को समझने में कुछ परेशानी हो रही है, यानी, चरण-दर-चरण कोड के साथ क्या खुशी हो रही है। शॉर्ट कोड को देखते हुए, मैं जानना चाहता हूं: जब क्लास मेनपेज कहा जाता है तो यह उस वर्ग के अंदर मौजूद हर चीज़ को निष्पादित करता है? रैखिक क्रम में? (पहली पंक्ति, दूसरी आदि के बाद)पायथन कक्षा में नियंत्रण प्रवाह को समझने में समस्या (एक Google ऐप इंजन में)

enter image description here

+0

http://webpy.org/docs/0.3/tutorial – dm03514

उत्तर

6

जब एक अजगर फ़ाइल निष्पादित किया जाता है, फाइल में हर बयान ऊपर से नीचे तक क्रियान्वित किया जाता है। आपके मामले में, वहाँ छह बयान कर रहे हैं:

from .. 
from .. 
class MainPage .. 
application = .. 
def main() .. 
if __name__ .. 

पहले दो अन्य अजगर मॉड्यूल मिल जाए, और उनके बयान है, जो की संभावना सिर्फ कक्षाओं का एक समूह को परिभाषित है, और फिर मान का उपयोग कर अपने मॉड्यूल में कुछ नाम निर्धारित करने वाले समस्त निष्पादित उन अन्य मॉड्यूल से। तो पहले दो बयान के बाद, हमारे पास webapp और run_wsgi_app परिभाषित किया गया है।

तीसरा बयान कक्षा MainPage कक्षा को परिभाषित करता है। यह कक्षा निकाय के अंदर बयानों को निष्पादित करके करता है, इस मामले में केवल एक ही है: def। ध्यान दें कि def कथन निष्पादित करने से फ़ंक्शन बॉडी में बयानों को निष्पादित नहीं किया जाता है, यह केवल उन बयानों को नामित फ़ंक्शन में एकत्र करता है। जब कक्षा का शरीर समाप्त होता है, तो परिभाषित सभी नाम कक्षा के गुण बन जाते हैं।

चौथा कथन webapp.WSGIApplication पर कॉल करता है, और परिणाम application पर निर्दिष्ट करता है।

पांचवां बयान main नामक फ़ंक्शन को परिभाषित करता है।

छठा बयान __name__ नाम पर दिखता है। हर बार एक पायथन फ़ाइल निष्पादित की जाती है, इसे __name__ चर दिया जाता है। अगर फ़ाइल मुख्य रूप से चल रही है, यानी, एक पायथन शुरू हुआ है, तो __name__ का मान "__main__" है। यह अगर कथन एक मुहावरे का अर्थ है, "क्या मैं मुख्य कार्यक्रम हूं?" इस मामले में, यह है, इसलिए अगर कथन का शरीर भी निष्पादित किया जाता है।

यदि शरीर को केवल main() फ़ंक्शन पर कॉल किया गया है, तो वह स्वयं run_wsgi_app फ़ंक्शन को आमंत्रित करता है, जो आपके पहले से निर्मित application मान को पास करता है।

एक डब्लूएसजीआई ऐप चलाने में शामिल है, लेकिन मूल रूप से यह है कि "जब तक कोई यूआरएल नहीं जाता तब तक प्रतीक्षा करें, और उसके बाद यूआरएल को कुछ कोड पर मैप करें, और फिर कोड निष्पादित करें।" आपके मामले में, आपने एक यूआरएल मानचित्र प्रदान किया है जो "/" MainPage से जुड़ा हुआ है। एक बार जब कोई व्यक्ति/URL पर जाता है, तो MainPage ऑब्जेक्ट बनाया जाएगा, और उस पर एक विधि लागू की जाएगी।

विशेष रूप से, क्योंकि HTTP विधि का दौरा करने/प्राप्त करने के लिए उपयोग की जाने वाली HTTP विधि, डब्लूएसजीआई ऐप धावक MainPage ऑब्जेक्ट पर .get() विधि को कॉल करता है। get विधि में बयान अनुक्रम में निष्पादित किए जाते हैं, प्रतिक्रिया के लिए कुछ डेटा लिखते हैं। जब फ़ंक्शन बॉडी में कोई और कथन नहीं होता है, तो यह वापस आता है। डब्लूएसजीआई एप्लीकेशन कंटेनर उस प्रतिक्रिया को वापस वेब ब्राउज़र पर भेजता है!

यह प्रोग्राम कभी समाप्त नहीं होता है, क्योंकि डब्लूएसजीआई एप्लिकेशन धावक अगली यूआरएल यात्रा के लिए हमेशा के लिए इंतजार कर रहा है। लेकिन अगर ऐसा नहीं होता है, तो आपकी मुख्य फ़ाइल में अंतिम वक्तव्य पूरा होने के बाद, पायथन प्रोग्राम किया जाएगा, और प्रक्रिया समाप्त हो जाएगी।

+0

आपके ध्यान और उत्कृष्ट उत्तर के लिए धन्यवाद, नेड। यह मुझे कई अन्य पहलुओं के लिए स्पष्ट किया। लेकिन मुझे अभी भी इस बारे में संदेह है: "एक बार जब कोई व्यक्ति/यूआरएल पर जाता है, तो मेनपेज ऑब्जेक्ट बनाया जाएगा, और उस पर एक विधि लागू की जाएगी"। जब मेनपेज ऑब्जेक्ट बनाया जाता है, तो यह हमेशा उस ऑब्जेक्ट के अंदर प्रक्रियाओं को निष्पादित करेगा (जैसे, पोस्ट, इत्यादि)? – craftApprentice

+0

ऐप को चलाने के लिए कोड ढूंढने का एकमात्र तरीका एक विधि के लिए ऑब्जेक्ट को देखकर है। तो हाँ, यह हमेशा उस वस्तु पर एक विधि चलाता है। –

1

कोड रैखिक रूप से निष्पादित नहीं करता है।

सबसे पहले, आप एक कक्षा को परिभाषित करते हैं जो किसी पृष्ठ के लिए डेटा तैयार करेगा जब एक निश्चित विधि (get) कहा जाता है। यह MainPage की कक्षा परिभाषा है।

फिर, आप इस कक्षा को सिस्टम के साथ पंजीकृत करते हैं, यह भी बताते हैं कि इस कक्षा का उपयोग कब करें। आप देख सकते हैं कि कोड पर हो रहा है जो application = ... से शुरू होता है। कोड यूआरएल पथ / पर MainPage का उपयोग करने के लिए वेबैप ढांचे को बताता है। जैसा कि आप कल्पना कर सकते हैं, आप यहां विभिन्न मार्गों के लिए कई कक्षाएं पंजीकृत कर सकते हैं। ध्यान दें कि कोड का यह टुकड़ा main से पहले एक बार निष्पादित किया जाता है।

फिर, आप प्रोग्राम एंट्री पॉइंट को परिभाषित करते हैं: main()। यह एक आसान है: आप ढांचे को application के साथ चलने के लिए शुरू करने के लिए बताएं। run_wsgi_app के तहत कोड एक अनुरोध के लिए इंतजार कर रहा है, पंजीकृत क्लास के खिलाफ यूआरएल पथ की जांच करता है, जब उसे प्राप्त होता है, तो get() विधि को कॉल करके पंजीकृत कक्षा से प्रतिक्रिया प्राप्त होती है, और प्रतिक्रिया भेजती है। बेशक, यह वास्तव में क्या हो रहा है के बारे में एक सकल oversimplification है।

अंत में, आप अंतिम कोड ब्लॉक में मुख्य कॉल करते हैं।

संक्षेप में प्रस्तुत करना: हम पहले main फोन है, जो run_wsgi_app कॉल है, जो एक MainPage को दर्शाता है और उसके get() विधि संरचना application का उपयोग कर कहता है।

+0

धन्यवाद, आपका स्पष्टीकरण vhallac सरल और स्पष्ट है। लेकिन, मैं जानना चाहता हूं: क्यों मुख्य() को बुलाया जाता है और ऑब्जेक्ट बनाया जाता है (मेनपेज इटैंटियेटेड होता है) यह प्राप्त विधि को निष्पादित करता है जब कॉल करने के लिए कुछ भी नहीं होता है, लेकिन केवल प्राप्त करने की परिभाषा (def get (self)) । मुझे समझ में नहीं आता कि नियंत्रण प्रवाह कैसे होता है, क्योंकि यदि यह एक सामान्य कार्य स्क्रिप्ट था, तो प्रक्रिया को परिभाषित करने के बाद मुझे इसे कॉल करना होगा। क्या आप मुझे इसके बारे में स्पष्टीकरण दे सकते हैं? – craftApprentice

+0

डब्लूएसजीआई ऐप रनर कॉल .get() क्योंकि HTTP विधि GET साइट पर जाने के लिए उपयोग किया गया था। –

+0

धन्यवाद एक बार, नेड। मैं समझने की शुरुआत कर रहा हूं कि क्या होता है, हालांकि "क्योंकि साइट विधि पर जाने के लिए HTTP विधि जीईटी का उपयोग किया जाता था" अभी भी मुझे थोड़ा अस्पष्ट लगता है। लेकिन मुझे पता है कि मुझे लगता है कि, अधिक उदाहरणों के साथ मैं समझने में सक्षम हूं (अन्य उदाहरणों के साथ(), जैसे पोस्ट())। मुझे लगता है कि प्रक्रिया को यह एक बुलेट गुप्त कहा जाता है, लेकिन अन्य प्रक्रियाओं (जैसे पोस्ट()) के पास एक और स्पष्ट कार्य कॉल होगा। अपना ज्ञान और अपना समय साझा करने के लिए धन्यवाद। – craftApprentice

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