Pythonのクラス継承について調べてみた
前回まで
http://ytyaru.hatenablog.com/entry/2017/10/23/000000
HTTP共通部を継承してGitHub固有部を実装した。
実装方法
前回のコード、最初はコールバック関数(delegate)で実装しようと思った。が、C#のように書けそうになかったので諦めた。
HTTP部の処理中に関数ポインタから呼び出すようにする。その関数ポインタを変更することで任意の処理を実行させる形。でも、よさげな実装方法がわからなかったので継承にした。
参考
http://qiita.com/icoxfog417/items/e8f97a6acad07903b5b0
[Python]クラス継承(super) - Qiita
pythonで継承(TypeError?) : Edo::World::Blog
こんなのクラスじゃない。と思うほど残念なPythonのクラス。
Interface
がないprotected
がない
試してみた
#!python3 #encoding:utf-8 class Parent(object): def __init__(self): self.value = 100 def __OverWrrideMethod(self): print('Parent Method!') def SuperMethod(self): print('Super Method!') self.__OverWrrideMethod() class Child(Parent): def __init__(self): super().__init__() def __OverWrrideMethod(self): # 変数とメソッドの参照方法が違うためややこしい。 # super().__OverWrrideMethod() # privateだから呼び出せない. `self.`では参照できず。 super().SuperMethod() # publicだから呼び出せる. `self.`では参照できず。 # print(super().value) # なぜか参照できず… AttributeError: 'super' object has no attribute 'value' print(super()) print(self.value) print('Child Method!') def Show(self): self.__OverWrrideMethod() if __name__ == '__main__': parent = Parent() child = Child() # child.__OverWrrideMethod() # privateだから呼び出せない child.Show() # print(child.super().value) # super()はクラス内でのみ使えるらしい
- 変数とメソッドの参照方法が違うためややこしい
- メソッド:
super().SuperMethod()
- 変数:
self.value
- メソッド:
self
とsuper()
という違いがある。統一して欲しかった。
オーバーライドはできるらしい。