दोस्तों, मुझे पाइथन कक्षा में नियंत्रण प्रवाह को समझने में कुछ परेशानी हो रही है, यानी, चरण-दर-चरण कोड के साथ क्या खुशी हो रही है। शॉर्ट कोड को देखते हुए, मैं जानना चाहता हूं: जब क्लास मेनपेज कहा जाता है तो यह उस वर्ग के अंदर मौजूद हर चीज़ को निष्पादित करता है? रैखिक क्रम में? (पहली पंक्ति, दूसरी आदि के बाद)पायथन कक्षा में नियंत्रण प्रवाह को समझने में समस्या (एक Google ऐप इंजन में)
उत्तर
जब एक अजगर फ़ाइल निष्पादित किया जाता है, फाइल में हर बयान ऊपर से नीचे तक क्रियान्वित किया जाता है। आपके मामले में, वहाँ छह बयान कर रहे हैं:
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
विधि में बयान अनुक्रम में निष्पादित किए जाते हैं, प्रतिक्रिया के लिए कुछ डेटा लिखते हैं। जब फ़ंक्शन बॉडी में कोई और कथन नहीं होता है, तो यह वापस आता है। डब्लूएसजीआई एप्लीकेशन कंटेनर उस प्रतिक्रिया को वापस वेब ब्राउज़र पर भेजता है!
यह प्रोग्राम कभी समाप्त नहीं होता है, क्योंकि डब्लूएसजीआई एप्लिकेशन धावक अगली यूआरएल यात्रा के लिए हमेशा के लिए इंतजार कर रहा है। लेकिन अगर ऐसा नहीं होता है, तो आपकी मुख्य फ़ाइल में अंतिम वक्तव्य पूरा होने के बाद, पायथन प्रोग्राम किया जाएगा, और प्रक्रिया समाप्त हो जाएगी।
आपके ध्यान और उत्कृष्ट उत्तर के लिए धन्यवाद, नेड। यह मुझे कई अन्य पहलुओं के लिए स्पष्ट किया। लेकिन मुझे अभी भी इस बारे में संदेह है: "एक बार जब कोई व्यक्ति/यूआरएल पर जाता है, तो मेनपेज ऑब्जेक्ट बनाया जाएगा, और उस पर एक विधि लागू की जाएगी"। जब मेनपेज ऑब्जेक्ट बनाया जाता है, तो यह हमेशा उस ऑब्जेक्ट के अंदर प्रक्रियाओं को निष्पादित करेगा (जैसे, पोस्ट, इत्यादि)? – craftApprentice
ऐप को चलाने के लिए कोड ढूंढने का एकमात्र तरीका एक विधि के लिए ऑब्जेक्ट को देखकर है। तो हाँ, यह हमेशा उस वस्तु पर एक विधि चलाता है। –
कोड रैखिक रूप से निष्पादित नहीं करता है।
सबसे पहले, आप एक कक्षा को परिभाषित करते हैं जो किसी पृष्ठ के लिए डेटा तैयार करेगा जब एक निश्चित विधि (get
) कहा जाता है। यह MainPage
की कक्षा परिभाषा है।
फिर, आप इस कक्षा को सिस्टम के साथ पंजीकृत करते हैं, यह भी बताते हैं कि इस कक्षा का उपयोग कब करें। आप देख सकते हैं कि कोड पर हो रहा है जो application = ...
से शुरू होता है। कोड यूआरएल पथ /
पर MainPage
का उपयोग करने के लिए वेबैप ढांचे को बताता है। जैसा कि आप कल्पना कर सकते हैं, आप यहां विभिन्न मार्गों के लिए कई कक्षाएं पंजीकृत कर सकते हैं। ध्यान दें कि कोड का यह टुकड़ा main
से पहले एक बार निष्पादित किया जाता है।
फिर, आप प्रोग्राम एंट्री पॉइंट को परिभाषित करते हैं: main()
। यह एक आसान है: आप ढांचे को application
के साथ चलने के लिए शुरू करने के लिए बताएं। run_wsgi_app
के तहत कोड एक अनुरोध के लिए इंतजार कर रहा है, पंजीकृत क्लास के खिलाफ यूआरएल पथ की जांच करता है, जब उसे प्राप्त होता है, तो get()
विधि को कॉल करके पंजीकृत कक्षा से प्रतिक्रिया प्राप्त होती है, और प्रतिक्रिया भेजती है। बेशक, यह वास्तव में क्या हो रहा है के बारे में एक सकल oversimplification है।
अंत में, आप अंतिम कोड ब्लॉक में मुख्य कॉल करते हैं।
संक्षेप में प्रस्तुत करना: हम पहले main
फोन है, जो run_wsgi_app
कॉल है, जो एक MainPage
को दर्शाता है और उसके get()
विधि संरचना application
का उपयोग कर कहता है।
धन्यवाद, आपका स्पष्टीकरण vhallac सरल और स्पष्ट है। लेकिन, मैं जानना चाहता हूं: क्यों मुख्य() को बुलाया जाता है और ऑब्जेक्ट बनाया जाता है (मेनपेज इटैंटियेटेड होता है) यह प्राप्त विधि को निष्पादित करता है जब कॉल करने के लिए कुछ भी नहीं होता है, लेकिन केवल प्राप्त करने की परिभाषा (def get (self)) । मुझे समझ में नहीं आता कि नियंत्रण प्रवाह कैसे होता है, क्योंकि यदि यह एक सामान्य कार्य स्क्रिप्ट था, तो प्रक्रिया को परिभाषित करने के बाद मुझे इसे कॉल करना होगा। क्या आप मुझे इसके बारे में स्पष्टीकरण दे सकते हैं? – craftApprentice
डब्लूएसजीआई ऐप रनर कॉल .get() क्योंकि HTTP विधि GET साइट पर जाने के लिए उपयोग किया गया था। –
धन्यवाद एक बार, नेड। मैं समझने की शुरुआत कर रहा हूं कि क्या होता है, हालांकि "क्योंकि साइट विधि पर जाने के लिए HTTP विधि जीईटी का उपयोग किया जाता था" अभी भी मुझे थोड़ा अस्पष्ट लगता है। लेकिन मुझे पता है कि मुझे लगता है कि, अधिक उदाहरणों के साथ मैं समझने में सक्षम हूं (अन्य उदाहरणों के साथ(), जैसे पोस्ट())। मुझे लगता है कि प्रक्रिया को यह एक बुलेट गुप्त कहा जाता है, लेकिन अन्य प्रक्रियाओं (जैसे पोस्ट()) के पास एक और स्पष्ट कार्य कॉल होगा। अपना ज्ञान और अपना समय साझा करने के लिए धन्यवाद। – craftApprentice
- 1. Google ऐप इंजन (पायथन) में कस्टम प्रमाणीकरण
- 2. पायथन + Google ऐप इंजन
- 3. पायथन सूची समझ को समझने में समस्या
- 4. Google ऐप इंजन + पायथन
- 5. पायथन और Google ऐप इंजन
- 6. Google ऐप इंजन (पायथन) में वर्तमान ऐप का नाम
- 7. पायथन पीआईएल लाइब्रेरी को खोजने में असमर्थ। Google ऐप इंजन
- 8. Google ऐप इंजन | पायथन | APP.YAML
- 9. Google ऐप इंजन में उपयोगकर्ता-एजेंट python
- 10. Google ऐप इंजन अंतर्राष्ट्रीयकरण सहायता आवश्यक (पायथन)
- 11. Google ऐप इंजन डेटास्टोर स्ट्रिंग एन्कोडिंग समस्या
- 12. Google ऐप इंजन में कैश-कंट्रोल
- 13. Google ऐप इंजन (पायथन) में सरल फेसबुक कनेक्ट
- 14. Google ऐप इंजन
- 15. केवल Google ऐप इंजन में https
- 16. Google ऐप इंजन
- 17. Google ऐप इंजन/पायथन - लॉगिंग स्वरूपण बदलें
- 18. Google ऐप इंजन में छवि exif डेटा
- 19. नियंत्रण प्रवाह में अगला उपयोग
- 20. Google ऐप इंजन
- 21. Google ऐप इंजन इंस्टेंस
- 22. जावास्क्रिप्ट में मूल प्रवाह नियंत्रण
- 23. Google ऐप इंजन - जावा या पायथन?
- 24. Google ऐप इंजन पायथन यूनिट टेस्ट
- 25. Google ऐप इंजन
- 26. Google ऐप इंजन एप्लिकेशन को
- 27. Google ऐप इंजन
- 28. Google ऐप इंजन एपीएनएस
- 29. Google ऐप इंजन
- 30. Google ऐप इंजन ऐप में डेटा संग्रहीत करना
http://webpy.org/docs/0.3/tutorial – dm03514