2012-12-31 15 views
6

मुझे __init__ और __call__ विधि का उपयोग कब करना चाहिए?__init__ या __call__?

मैं उलझन में हूं कि मुझे पहले या दूसरे का उपयोग करना चाहिए या नहीं।

फिलहाल मैं उन्हें दोनों का उपयोग कर सकता हूं, लेकिन मुझे नहीं पता कि कौन सा उचित है।

+2

ठीक है, आप क्या करने की कोशिश कर रहे हैं? – arshajii

+0

आप दोनों का उपयोग कर सकते हैं, और दोनों को लागू कर सकते हैं। यदि आप हमें नहीं बताएंगे कि आप क्या करने की कोशिश कर रहे हैं, तो हम कैसे मदद कर सकते हैं? क्या आपको दस्तावेज भ्रमित कर रहा था? किस भाग उलझन में? –

+2

संबंधित: http://stackoverflow.com/questions/9663562/what-is-difference-between-init-and-call-in-python –

उत्तर

15

ये दोनों पूरी तरह से अलग हैं।

__init__() निर्माता है, यह वस्तु के नए उदाहरणों पर चलाया जाता है।

__call__() चलाया जाता है जब आप ऑब्जेक्ट का उदाहरण कॉल करने का प्रयास करते हैं जैसे कि यह एक फ़ंक्शन था।

उदाहरण के लिए: कहते हैं कि हम एक वर्ग, Test है:

a = Test() #This will call Test.__init__() (among other things) 
a() #This will call Test.__call__() 
+1

मुझे अब मिल गया, धन्यवाद ! – JeremyL

+1

जब वे समान होते हैं तो छोड़कर ... मैं आलसी स्ट्रिंग टोकेनाइज़र कक्षाएं बनाती हूं जो कॉल करने योग्य पुनरावृत्त हैं। कार्यान्वयन डीआरवाई को बनाए रखने और उपयोगकर्ता को समकक्ष एपीआई के साथ प्रदान करने के लिए, '__call __()' रिटर्न 'स्वयं', और '__init __()' कॉल '__call __() 'एक ही तर्क के साथ। कल्पना करें 'टोकन = सूची (टोकनेज़र (डॉक्टर, ngrams = 2)) 'tokenizer = Tokenizer() के समान; टोकन = सूची (टोकनेज़र (डॉक्टर, ngrams = 2)) 'सूची के समान '(टोकनज़र.tokenize (डॉक्टर, ngrams = 2))' यह" बस काम करता है "इससे कोई फर्क नहीं पड़ता कि उपयोगकर्ता इसका उपयोग कैसे करना पसंद करता है। – hobs

+0

@ हॉब्स, महान उदाहरण! आप इसे उत्तर के रूप में क्यों नहीं डालते? – wombatonfire

9

एक त्वरित परीक्षण उनके बीच के अंतर

class Foo(object): 
    def __init__(self): 
     print "init" 
    def __call__(self): 
     print "call" 

f = Foo() # prints "init" 
f()  # prints "call" 

कोई रास्ता नहीं में चलता कर रहे हैं इन विनिमेय

6

सबसे अधिक संभावना है, तो आप __init__ का उपयोग करना चाहते हैं। यह वह तरीका है जो आपकी कक्षा का एक नया उदाहरण शुरू करने के लिए उपयोग की जाती है, जिसे आप कक्षा को कॉल करके करते हैं। __call__ यदि आप अपने उदाहरणों को कॉल करने योग्य बनाना चाहते हैं। यह अक्सर कुछ नहीं किया जाता है, हालांकि यह उपयोगी हो सकता है। इस उदाहरण को चित्रित करना चाहिए:

>>> class C(object): 
... def __init__(self): 
...  print 'init' 
... def __call__(self): 
...  print 'call' 
... 
>>> c = C() 
init 
>>> c() 
call 
>>> 
0

एक साधारण कोड स्निपेट इसे बेहतर तरीके से विस्तृत करेगा।

>>> class Math: 
...  def __init__(self): 
...    self.x,self.y=20,30 
...  def __call__(self): 
...    return self.x+self.y 
... 
>>> m=Math() 
>>> m() 
50 
संबंधित मुद्दे