2013-03-18 2 views
0

그냥 파이썬을 배우기 시작했습니다. 나는 __call__ 메소드를 발견했습니다. 나는이 때 __init__ 호출되는 이해하고 때 __call__이 간단한 예제를 실행하여 호출됩니다 :java에 python __call__과 동일한 기능이 있습니까?

class Constructor: 
    def __init__(self, a): 
     print "__init__ called" 

    def __call__(self): 
     print "__call__ called" 

    def dummy(self): 
     print "a dummy method called" 

print "creating x obj" 
x = Constructor(1) 
print "calling x object" 
x() 

콘솔 출력 :

creating x obj 
__init__ called 
calling x object 
__call__ called 

내 질문은 :

나는 자바 배경에서 오는
  1. , 나는 __init__이 자바 생성자에 매핑된다는 것을 알고 있으며, java가 __call__과 동등한 성능을 제공하므로이 점을 더 잘 이해할 수 있습니까?
  2. __call__이 유용 할 수있는 간단한 예를 누군가 줄 수 있습니까?
+0

나는 당신이 사용할 수있는 것은 실행 가능한 인터페이스 생각 . 실행 가능한 인터페이스를 구현 한 객체를 만든 다음 x.run()을 호출하십시오. 인터페이스 (예 : 사용자 인터페이스)는 Observer 패턴을 가능하게합니다. IMO는 재사용 가능한 객체를 작성하는 가장 중요한 단일 패턴입니다. http://en.wikipedia.org/wiki/Observer_pattern –

+0

파이썬 클래스에서 run()이라는 간단한 메서드를 정의하여 x.run()을 간단하게 수행 할 수 있다면 혼란 스럽다. 왜 파이썬은 __ 호출 __과 같은 것을 디자인하는데 전혀 신경을 쓰지 않는가? – Shengjie

+2

파이썬에서'__call__'은 언어의 기본입니다 (http://eli.thegreenplace.net/2012/03/23/python-internals-how-callables-work/ 참조). 다음과 같은 여러 가지 문제/작업을 해결하는 데 도움이됩니다. 관찰자 패턴, 콜백 등등. –

답변

4

__call__는 클래스에 () 연산자를 오버로딩 동일합니다. 이것은 C++에서는 가능하지만 Java에서는 가능하지 않습니다. 그것은 함수 객체 인 (때로는 펑터)을 가질 수 있습니다.

는 파이썬에서 이러한 호출 객체를 불린다.

간단히 말해서, 개체를 함수로 취급 할 수 있습니다. 이러한 개념에 대한

실제 사용이 답변의 범위를 벗어하지만 인터넷의 주위에 많은 정보가있다. 예 : Wikipedia. 그것은 매우 간단 http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html, 단지 run() 메소드 :

+0

파이썬에서는 펑터 (functor)가 아닌 호출 가능한 객체 *라고 부릅니다. Functor는 이미 컴퓨터 과학에서 뭔가 다른 것을 의미합니다. –

+0

'Functor'와'Function Object'와'Callable Object'는 모두 같은 의미입니다 - 당연히 각각의 다른 의미가있을 수 있습니다. – Nick

+0

음, "펑터"(카테고리 이론에서)의 주요 의미는 매우 중요합니다. 하지만 호출 가능 객체에 대한 "펑터"라는 용어는 C++ 커뮤니티에서만 실제로 사용된다고 생각합니다. 파이썬 문서 * 어디서나 *에서 "펑터"라는 용어는 찾을 수 없지만 "호출 가능"은 일반적입니다. –

3

아니요, Java에는 __call__과 같은 내용은 없습니다. 메서드 호출로 개체를 사용할 수 없습니다. 당신은 방법을 만들어야하고 전화 :

class Constructor{ 
    Constructor(){ 
     System.out.println("Constructor called"); 
    } 

    void doStuff(){ 
     System.out.println("do called"); 
    } 

    public static void main(String[] args){ 
     System.out.println("Creatng x obj"); 
     x = new Constuctor(); 
     System.out.println("Calling x obj"); 
     x.doStuff(); 
    } 
} 
+0

예에서 doStuff은 여기에서 '__call__'역할을합니다. – Shengjie

+0

@Shengije 정확 하 게. –

관련 문제