2012-11-13 23 views
5

कोड का एक टुकड़ा काम करता है जो मुझे नहीं दिखता है। यह मेरी समझ से काम नहीं करना चाहिए। समस्या को आसानी से नीचे बताया गया है:हमें पाइथन आयात विवरणों की आवश्यकता कब होती है?

"Main.py"

from x import * #class x is defined 
from y import * #class y is defined 


xTypeObj = x() 
yTypeObj = y() 
yTypeObj.func(xTypeObj) 

"x.py"

class x(object): 

    def __init__... 
     ... 
    def functionThatReturnsAString(self): 
     return "blah" 

"y.py"

#NO IMPORT STATEMENT NEEDED?? WHY 

class y(object): 
    def __init__... 
     ... 
    def func(self, objOfTypeX): 
     print(objOfTypeX.functionThatReturnsAString()) 

मेरा प्रश्न है मुझे

प्रकार के "y.py" में आयात कथन क्यों नहीं है
from x import functionThatReturnAString() 

यह कैसे पता चलता है कि इस विधि को कैसे कॉल करें?

+0

आप कक्षाओं के बारे में बात करते हैं और कुछ तरीकों को कॉल करते हैं, लेकिन आपके मॉड्यूल केवल कार्यों को परिभाषित करते हैं, कक्षाओं और विधियों के नहीं ... #confusion – heltonbiker

+4

आप * वास्तव में * [पायथन ट्यूटोरियल] का अध्ययन करना चाहते हैं (http: //docs.python। संगठन/2/ट्यूटोरियल /), विशेष रूप से [वर्गों पर अनुभाग] (http://docs.python.org/2/tutorial/classes.html)। –

+0

आपने इसे पैरामीटर के रूप में पास किया है। – Keith

उत्तर

3

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

  1. तरीके (और डेटा सदस्य) को जोड़ा गया और रनटाइम पर एक उदाहरण से हटाया जा सकता है, तो वर्ग फू के दो उदाहरणों वास्तव में अलग अलग तरीकों भले ही वे एक ही प्रकार के हो सकते हैं।
  2. विधियों (और डेटा सदस्यों) को रनटाइम पर कक्षा से जोड़ा और हटाया जा सकता है, जो सभी मौजूदा उदाहरणों के साथ-साथ नए उदाहरणों को भी प्रभावित करेगा।
  3. बेसिस कक्षाओं को रनटाइम पर कक्षा में जोड़ा और हटाया जा सकता है।

ध्यान दें कि यह गतिशील रूप से टाइप किए गए लैंगुग और स्थिर रूप से भाषाओं के बीच के सभी अंतरों की एक विस्तृत सूची नहीं है।

+0

"सी ++ और जावा कॉल जैसी स्थिर टाइप की गई भाषाओं के विपरीत विधियों को तब तक बाध्य नहीं किया जाता है जब तक वे वास्तव में निष्पादित नहीं होते हैं, इस प्रकार मॉड्यूल को आयात करना क्यों था कि विधि परिभाषित नहीं है" --- वास्तव में वह उत्तर जो मैं ढूंढ रहा था। धन्यवाद! – Tommy

1

फ़ंक्शन yTypeObj.func को main.py से कॉल किया जाता है जहां कक्षा आयात की जाती है। इसलिए ऑब्जेक्ट का निर्माण और कार्य को पारित किया जा सकता है, इसकी सभी विधियों के साथ (functionThatReturnAStringobjOfTypeX का एक तरीका है)।

+0

इसलिए जब मुझे आयात की आवश्यकता होती है तो मैं वास्तव में समझ में नहीं आता हूं। किसी भी वर्ग में नहीं जो किसी अन्य वर्ग की विधि कहता है, क्योंकि y x का फ़ंक्शन कॉल करता है। – Tommy

+0

जब आप एक नई वस्तु को परिभाषित करना चाहते हैं तो आपको कक्षा (या कोई अन्य विशेषता) आयात करने की आवश्यकता है। अन्यथा, आपके पास एक नई वस्तु बनाने के लिए नुस्खा नहीं होगा। आप ऑब्जेक्ट को अपने इच्छित किसी भी फ़ंक्शन पर पास कर सकते हैं (जिसे इस तरह के वर्ग के अस्तित्व के बारे में पता होना आवश्यक नहीं है) – btel

9

पायथन एक ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषा है। ऐसी भाषा में, मूल्य वस्तुएं हैं, और वस्तुओं में विधियां हो सकती हैं।

functionThatReturnsAString समारोह एक वर्ग पर एक तरीका है, और objOfTypeX उस वर्ग के एक उदाहरण है। कक्षा के उदाहरण उनके साथ कक्षा के सभी तरीकों को ले जाते हैं।

>>> alist = [] 
>>> alist.append(1) 
>>> alist 
[1] 

list वर्ग एक .append() विधि है, और आप इसे कहते हैं सक्षम होने के लिए है कि विधि आयात करने की आवश्यकता नहीं है:

यही कारण है कि, उदाहरण के लिए, अजगर में list वस्तुओं एक .append() विधि है । आपको बस एक सूची उदाहरण का संदर्भ है।

तकनीकी रूप से, एक अजगर list एक प्रकार है, लेकिन उस भेद बात यहाँ नहीं है। पूरी तरह से, इस चर्चा के उद्देश्य के लिए, वर्गों के समान प्रकार समान हैं।

कृपया जाएं और Python Tutorial पढ़ें, यह बाद के अध्याय में कक्षाओं को बताता है (लेकिन आप पहले अध्यायों के पहले सेट के माध्यम से स्किम करना चाहते हैं)।

+1

मेरा उत्तर सही और अनुपयोगी था। मार्टिजन के साथ जाओ। :-) –

+0

आपका उत्तर इस तरह से आया कि मैं जितना अधिक अज्ञानी था। समस्या "वस्तु उन्मुख" नहीं है, मुझे पता है कि कक्षा का एक उदाहरण क्या है .... मैं सी ++ दुनिया से हूं। सवाल "गतिशील बनाम स्थैतिक टाइप" से है। सी ++ में, y.py में, आपको एक हेडर शामिल करना होगा जो objOfTypeX.functionThatReturnsAString() का हस्ताक्षर देता है, या फिर संकलन समय पर यह कहता है कि "objOfTypeX का कोई तरीका नहीं है ..."। पायथन में मुझे लगता है कि यह रनटाइम पर मौजूद होने के लिए इस विधि को देखता है, और अन्यथा, एक त्रुटि फेंकता है। आपका जवाब इस पर छू नहीं था, इसलिए मैं एक और स्वीकार कर रहा हूं। – Tommy

+0

यही है, मुझे यकीन नहीं था कि क्यों funct() को यह सूचित करने की आवश्यकता नहीं है कि विधि functionThatReturnsAString() वास्तव में मौजूद है, क्योंकि आपको यह बताकर C++ में "साबित" होना चाहिए कि यह फ़ंक्शन वास्तव में मौजूद है। मुझे नहीं पता था कि अजगर को ऐसे सबूत की आवश्यकता नहीं है, और केवल रनटाइम पर बम कहता है, "यह फ़ंक्शन मौजूद नहीं है जैसा आपने कहा था"। – Tommy

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

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