【Python】オーバーライドっぽい処理を実装する

Tips

 

めっちゃ久しぶりの更新

 

目的

Pythonでオーバーライドっぽい関数の処理をさせたい。

具体的には引数の数で関数の処理を分けたい。

 

リストを引数にする

Pythonのリストは長さ固定でないので、リストを引数にして、その長さによって処理を変えれば簡単に実装できる。

# override.py
# coding:utf-8

def calc(list):
  #引数が1つならそれを倍にして返す
  #2つ以上ならそれぞれを足して返す
  if len(list) == 1:
    return list[0] * 2
  elif len(list) >= 2:
    res = 0
    for i in list:
      res += i
    return res

def main():
  print(calc([5]))
  print(calc([5,10]))
  print(calc([5,10,15]))

if __name__ == "__main__":
  main()
# python override.py
 10
 15
 30

 

不変長引数を使う

たぶんこっちのほうがよりオーバーライドっぽい

# override.py
# coding:utf-8

def calc(*args):
  #引数が1つならそれを倍にして返す
  #2つ以上ならそれぞれを足して返す
  if len(args) == 1:
    return args[0] * 2
  elif len(args) >= 2:
    res = 0
    for i in args:
      res += i
    return res

def main():
  print(calc(5))
  print(calc(5,10))
  print(calc(5,10,15))

if __name__ == "__main__":
  main()
 # python override.py
 10
 15
 30 

 

ただし、この場合だと引数が0個の場合でも呼び出してしまえる。

それを防ぐためには不変長引数をデフォルト引数にしてやればよい。

# override.py
# coding:utf-8

def calc(arg1, *args):
  #引数が1つならそれを倍にして返す
  #2つ以上ならそれぞれを足して返す
  if len(args) == 0:
    return arg1 * 2
  elif len(args) >= 1:
    res = arg1
    for i in args:
      res += i
    return res

def main():
  print(calc(5))
  print(calc(5,10))
  print(calc(5,10,15))

if __name__ == "__main__":
  main()

こうしておくと、引数が1つはないと使用できない(エラーを吐く)ようになる。

コメント

タイトルとURLをコピーしました