1

__call__Pythonの学習を始めたばかりで、メソッドに出くわしました。簡単な例を実行することで__init__、いつ呼び出され、いつ呼び出されるかを理解できます。__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. 私はJavaのバックグラウンドから来ました.Javaコンストラクタへのマップを知っています.Javaには、これをよりよく理解するのに役立つ__init__同等のものがありますか?__call__
  2. __call__誰かがいつ役立つかの簡単な例を教えてもらえますか?
4

2 に答える 2

5

__call__()クラスで演算子をオーバーロードすることと同じです。これは C++ では可能ですが、Java では不可能です。これにより、関数オブジェクト(ファンクターと呼ばれることもあります) を持つことができます。

Python では、これらは呼び出し可能オブジェクトと呼ばれます。

簡単に言えば、これによりオブジェクトを関数として扱うことができます。

このような概念の実際の使用は、この回答の範囲を超えていますが、インターネットにはたくさんの情報があります。たとえばウィキペディア

于 2013-03-18T10:49:08.723 に答える
3

いいえ、__call__Java のようなものはありません。オブジェクトをメソッド呼び出しとして使用することはできません。メソッドを作成して呼び出す必要があります。

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();
    }
}
于 2013-03-18T10:47:00.190 に答える