कक्षा के भीतर अजगर कॉल फ़ंक्शन


242

मेरे पास यह कोड है जो दो निर्देशांक के बीच की दूरी की गणना करता है। दोनों कार्य एक ही कक्षा में होते हैं।

हालांकि मैं समारोह कैसे कहते हैं distToPointसमारोह में isNear?

class Coordinates:
    def distToPoint(self, p):
        """
        Use pythagoras to find distance
        (a^2 = b^2 + c^2)
        """
        ...

    def isNear(self, p):
        distToPoint(self, p)
        ...

41
प्रयास करें:
self.distToPoint

क्या होगा अगर Near और DistToPoint अलग-अलग तर्क दे रहे हैं। फिर हम distToPoint को कैसे कह सकते हैं जो कक्षा के अंदर है? कोई भी मुझे समझा सकता है कि कृपया।
राघवेंद्र गुप्ता

जवाबों:


394

चूंकि ये सदस्य कार्य हैं, इसलिए इसे उदाहरण के लिए सदस्य फ़ंक्शन के रूप में कॉल करें self

def isNear(self, p):
    self.distToPoint(p)
    ...

2
लेकिन सावधान रहें स्व.फ़ू () विधि रिज़ॉल्यूशन ऑर्डर का उपयोग करेगा जो एक अलग वर्ग में एक फ़ंक्शन को हल कर सकता है।
फ्रांसिस डेवी

यदि हम स्वयं का उपयोग नहीं करते हैं तो क्या होगा? और सीधे distToPoint (पी) को बुलाओ?
मार्लोन एबेकून

3
@ मर्लोन अबेकून "स्व" तर्क गायब होगा
पीटीपट्टी

1
क्या होगा अगर Near और DistToPoint अलग-अलग तर्क दे रहे हैं। फिर हम distToPoint को कैसे कह सकते हैं जो कक्षा के अंदर है? कोई भी मुझे समझा सकता है कि कृपया।
राघवेंद्र गुप्ता

46

यह distToPointआपके वर्ग के अंदर होने के कारण काम नहीं करता है, इसलिए यदि आप इसे संदर्भित करना चाहते हैं, तो आपको इसे classname के साथ उपसर्ग करने की आवश्यकता है, जैसे classname.distToPoint(self, p):। आपको ऐसा नहीं करना चाहिए, हालांकि। इसका एक बेहतर तरीका यह है कि कक्षा उदाहरण के माध्यम से सीधे विधि का उल्लेख किया जाए (जो कि वर्ग विधि का पहला तर्क है), जैसे self.distToPoint(p):।


@Aleski। यदि यह एक सामान्य विधि है (सभी उदाहरणों के लिए आम है और बिना किसी उदाहरण के विधि में संदर्भित विशिष्ट चर), तो क्या आप बता सकते हैं कि किसी को classname.distToPoint (स्वयं, p) का उपयोग क्यों नहीं करना चाहिए?
युगमॉर्फ

2
@ युगमफोर: एक ही स्थिति है जहां किसी को उपयोग करना चाहिए classname.distToPoint(self, p): जब आप एक उपवर्ग को परिभाषित करते हैं जो ओवरराइड करता है distToPoint, लेकिन मूल को कॉल करने की आवश्यकता होती है। यदि आपने self.distToPoint(p)उस स्थिति में सामान्य की तरह कॉल करने का प्रयास किया है , तो आप उस विधि को कॉल कर रहे हैं जिसे आप अभी परिभाषित कर रहे हैं, और एक अनंत पुनरावृत्ति में मिलेंगे। यदि एक वर्ग के अंदर नहीं है, तो केवल एक ही स्थिति है जहां आप classname.distToPoint(obj, p)इसके बजाय उपयोग करेंगे obj.distToPoint(p): यदि ओब्ज उपवर्ग का एक उदाहरण हो सकता है, लेकिन आपको मूल distToPointपरिभाषित (जारी)
एलेक्सी तोरामो

1
में classnameलेकिन ध्यान दें कि यह बहुत hacky है और एक के बिना सामान्य रूप में नहीं किया जाना चाहिए - उपवर्ग में ओवरराइड संस्करण के बजाय बहुत अच्छा कारण। ध्यान दें कि जब आप किसी वर्ग के माध्यम से स्पष्ट रूप से एक विधि कहते हैं, तो आप उप-प्रकार बहुरूपता को तोड़ते हैं (ऊपर दिए दोनों उदाहरणों में, आप विशेष रूप से ऐसा करना चाहते हैं)। इसलिए संक्षेप में: आपको केवल कक्षा के माध्यम से एक विधि को स्पष्ट रूप से कॉल करना चाहिए जब आपको कुछ [अच्छे] कारण से उप-प्रकार के बहुरूपता को दरकिनार करने की आवश्यकता होती है। यदि विधि को ओवरराइड नहीं किया गया है, तो दो तरीके समान हैं, लेकिन self.distToPoint(p)कम और अधिक पठनीय है, (जारी)
अलेक्सई तोरहमो

इसलिए आपको निश्चित रूप से इसका उपयोग करना चाहिए। अब, आपके प्रश्न की बारीकियों के लिए: यदि आपकी विधि किसी भी उदाहरण के चर का उपयोग नहीं करती है, तो हो सकता है कि इसके स्थान पर एक वर्गमिथ हो? आप @classmethodविधि से पहले जोड़कर बनाते हैं , और उसके बाद आपको selfपहले तर्क के रूप में कोई उदाहरण ( ) नहीं मिलेगा - इसके बजाय आपको कक्षा मिलती है, इसलिए आपको पहले तर्क का नाम देना चाहिए। clsबजाय। उसके बाद, आप obj.distToPoint(p)या तो classmethod को कॉल कर सकते हैं या classname.distToPoint(p)(नोट करें obj)। आपको अभी भी संभवतः (जारी) का
Aleksi Torhamo

obj.distToPoint(p)हालांकि, अगर आपके हाथों पर सिर्फ एक प्रासंगिक उदाहरण है, जब तक - फिर से - आपके पास उप-प्रकार के बहुरूपता को दरकिनार करने का कुछ [अच्छा] कारण नहीं है, क्योंकि क्लासमैथोड को उप-वर्ग में भी ओवरराइड किया जा सकता है। बेशक, यदि आपके पास एक प्रासंगिक उदाहरण उपलब्ध नहीं है, तो आपको हर तरह से एक क्लास के माध्यम से सीधे एक क्लासमेट को बुलाना चाहिए ।
एलेक्सी तोरामो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.