2012-12-31 2 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

동일하게 만들 때를 제외하고 ... 호출 가능한 iterables 인 lazy string Tokenizer 클래스를 빌드합니다. 구현 DRY를 유지하고 사용자에게 동등한 API를 제공하려면'__call __()'은'self'를 반환하고'__init __()'는 같은 인수를 사용하여'__call __()'을 호출합니다. Tokenizer = Tokenizer()와 같은'tokens = list (Tokenizer (doc, ngrams = 2))'를 상상해보십시오. tokens = list (tokenizer (doc, ngrams = 2))'list (tokenizer.tokenize (doc, ngrams = 2))와 동일'사용자가 그것을 어떻게 사용 하든지 상관없이 그냥 작동한다. – hobs

+0

@hobs, 훌륭한 예! 왜 그걸 답으로 쓰지 않는거야? – 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 
관련 문제