実践:その5
最後に、別モジュールに用意したクラスを継承することでNet2クラスの機能を拡張する。
code:module.py
class MyModule:
def __init__(self):
print('☆スーパークラスから継承したコンストラクタ☆')
print('☆ここでクラス変数などを宣言することもできる☆')
def __call__(self, x):
y = self.calc(x)
return y
def show_params(self):
print('ac1:', self.ac1.n)
print('ac2:', self.ac2.n)
参考:モジュールの読み込み
MyModuleクラスを継承することで、Net2クラスに以下の機能が追加される。
__call__メソッドにより、メソッド名calcを用いること無く回路への入力を行うことができる。
show_paramsメソッドにより、回路を構成する2個のアキュムレータが保持する値を表示する。
__init__:特に何もしていない、オーバーライドされたメソッドの呼び出しを体感することが目的。
継承によってNet2のクラス定義が拡張される様子の概略図を示す。
https://scrapbox.io/files/652c7796e9869a001c2648ca.png
さて、プログラム本体は次のようになる。アキュムレータには実践:その2のacc2.pyで示したMyAccumulator2クラスを用いること。
code:acc5.py
import module
class Net2(module.MyModule): # この行だけが変更点
def __init__(self):
super().__init__()
self.ac1 = MyAccumulator2() # (◇)
self.ac2 = MyAccumulator2() # (◇)
def calc(self, x):
x = self.ac1(x)
x = self.ac2(x)
return x
## ここでMyAccumulate2クラス定義を行う ##
net = Net2() # (☆)
print('ステップ1')
x = 1
y = net(x) # (1)
net.show_params()
print('ステップ2')
x = 2
y = net(x) # (1)
net.show_params()
print('ステップ3')
x = 1
y = net(x) # (1)
net.show_params()
呼出し(☆) によりNet2型のインスタンスが生成される。その中でインスタンス変数ac1, ac2に対応するMyAccumulate2型のインスタンスが生成される(◇)。結果としてメモリ上に生成されたオブジェクト群の関係は次のようになる。
https://scrapbox.io/files/652c78f4295e2b001cec3369.png
code:(実行結果).py
$ python3 -i acc5.py
☆親クラスから継承したコンストラクタ☆
ステップ1
ac1: 1
ac2: 1
ステップ2
ac1: 3
ac2: 4
ステップ3
ac1: 4
ac2: 8