めっちゃ久しぶりの更新
目的
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つはないと使用できない(エラーを吐く)ようになる。
コメント