やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Pythonのクラス継承について調べてみた

前回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

selfsuper()という違いがある。統一して欲しかった。

オーバーライドはできるらしい。

所感

Pythonのクラスはしょぼい。C#で書きたくなる。