質問: A(1) print(a.act(5)) #エラー文 TypeError: 'A' object is not callable ```
回答: 質問2 > > self(x)とは何ですか? > > > `self` は自身のインスタンスを指します。 Python では、インスタンスに対して、() で関数のように呼び出す (例: `myobj()`) と関数呼び出しといって特殊メソッド `__call__()` が呼ばれます。 なので、self() は自身のインスタンスの関数呼び出しになります。 `__call__`でクラスインスタンスを関数のように呼び出す - Qiita ``` class Myclass: def __call__(self, x): return x + 1 obj = Myclass() print(obj(1)) # 2 ``` 質問1 > > 無いのであればなぜこの関数は書かれていて、他のどこでニューラルネットワークに学習データを与えているのでしょうか? > > > Pytorch では、nn.Module クラスの `__call__()` 関数内で `forward()` を呼び出すようになっています。 なので、`nn.Module` クラスを継承したクラスで `forward()` 関数を実装しておけば、そのクラスのインスタンスに対して、() で関数呼び出ししたら、実質的に `forward()` の中身が呼ばれるという仕組みです。 質問3 > > 以下に質問2に対する自分の理解の為に作成したコードとエラー文を載せておきます。 > > > TypeError: 'A' object is not callable > > 型エラー: オブジェクト A は関数呼び出し可能ではありません。 > > > callable (呼び出し可能) とは、() で関数呼び出しができるという要件を意味しますが、質問のコードだと、`__call__()` が実装されていないクラス `A` に対して、関数呼び出ししようとしているので、できないいうエラーです。 「nn.Module を継承したクラスで forward() を実装すると、model() のように呼び出した際に forward() が呼ばれる事」は以下のコードで説明がつきます。 ``` class Myclass: def __call__(self, x): return self.hoge(x) def hoge(): pass class MySubClass(Myclass): def hoge(self, x): # 親クラスの関数 hoge() をオーバーライド return x + 1 obj = MySubClass() print(obj(1)) # 2 ```