2011-03-02 13 views
23

में तर्क मैं पाइथन में निर्माता __init__ के तर्कों को समझना चाहता हूं।__init__ और पायथन

class Num: 
    def __init__(self,num): 
     self.n = num 
    def getn(self): 
     return self.n 
    def getone(): 
     return 1 
myObj = Num(3) 

print myObj.getn() 

परिणाम:

print myObj.getone() 

परिणाम:: त्रुटि 'getone()' कोई तर्क (1given) लेता है 3

मैं getone() विधि कॉल।

तो मैं बदल देते हैं:

def getone(): 
    return 1 

साथ
def getone(self): 
    return 1 

परिणाम: 1 यह ठीक है।

लेकिन getone() विधि को कोई तर्क की आवश्यकता नहीं है।

क्या मुझे अर्थहीन तर्क का उपयोग करना है?

+6

वे अर्थहीन नहीं हैं। कक्षा के हर तरीके में हमेशा एक अंतर्निहित तर्क होता है, उदाहरण। सी ++ में यह वही है, लेकिन आप इसे तर्क सूची में कभी नहीं देखते हैं क्योंकि यह परी जंगल की झाड़ियों से जादुई रूप से दिखाई देता है।पायथन 'स्पष्ट है 'स्पष्ट' से बेहतर है। –

+1

आप जो भी चाहते हैं उसे करने के लिए @staticmethod और @classmethod सजावटी का उपयोग कर सकते हैं। कृपया मेरे उत्तर में उदाहरण देखें। – stderr

उत्तर

31

पायथन इंस्टेंस विधियों को स्वयं तर्क की आवश्यकता होती है। कक्षा के तरीके कक्षा को पहले तर्क के रूप में लेते हैं। स्टेटिक विधियों को या तो उदाहरण (self) या कक्षा (cls) तर्क की आवश्यकता नहीं है।

__init__ एक विशेष कार्य है और बिना __new__ ओवरराइड किए बिना इसे कक्षा के पहले तर्क के रूप में हमेशा दिया जाएगा।

builtin classmethod और staticmethod सज्जाकार का उपयोग कर एक उदाहरण:

import sys 

class Num: 
    max = sys.maxint 

    def __init__(self,num): 
     self.n = num 

    def getn(self): 
     return self.n 

    @staticmethod 
    def getone(): 
     return 1 

    @classmethod 
    def getmax(cls): 
     return cls.max 

myObj = Num(3) 
# with the appropriate decorator these should work fine 
myObj.getone() 
myObj.getmax() 
myObj.getn() 

कहा कि, मैं किफ़ायत से @classmethod/@staticmethod उपयोग करने के लिए कोशिश करेंगे। यदि आप अपने आप को ऐसे ऑब्जेक्ट्स बनाते हैं जिनमें staticmethod के अलावा कुछ भी शामिल नहीं है, तो संबंधित कार्यों का एक नया मॉड्यूल तैयार करने के लिए और अधिक पाइथोनिक चीज होगी।

6

प्रत्येक विधि को एक तर्क स्वीकार करने की आवश्यकता होती है: उदाहरण स्वयं (या कक्षा यदि यह एक स्थिर विधि है)।

Read more about classes in Python

3

अजगर आप हमेशा वर्ग तरीकों को कम से कम एक तर्क में पारित करना होगा में, तर्क self है और वह अपने उदाहरण ही

4

तथ्य यह है कि अपने विधि नहीं उपयोग करता है के लिए एक संदर्भ अर्थहीन नहीं है self तर्क (जो कि उदाहरण से जुड़ा हुआ है इसका उदाहरण है) इसका मतलब यह नहीं है कि आप इसे छोड़ सकते हैं। यह हमेशा वहां होना चाहिए, क्योंकि पाइथन हमेशा इसे पास करने का प्रयास कर रहा है।

2

वर्तमान ऑब्जेक्ट को विधि के पहले पैरामीटर के रूप में स्पष्ट रूप से पारित किया गया है। self पारंपरिक नाम है। आप इसे जो कुछ भी चाहते हैं उसे कॉल कर सकते हैं लेकिन दृढ़ता से सलाह दी जाती है कि आप इस सम्मेलन से भ्रम से बचने के लिए चिपके रहें।

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