【Python】デコレータを用いて関数に機能を追加する
Pythonでの関数の機能追加
デフォルト引数の追加
Pythonの関数では、デフォルト引数を指定することで、引数を省略した場合にデフォルトの値を使用できます。
def greet(name="ゲスト"):
print(f"こんにちは、{name}さん!")
greet() # こんにちは、ゲストさん!
greet("太郎") # こんにちは、太郎さん!
キーワード引数の追加
キーワード引数を使うことで、引数の順番を気にせずに関数を呼び出すことができます。
def introduce(name, age, city):
print(f"私は{name}です。{age}歳で、{city}に住んでいます。")
introduce(age=25, city="東京", name="花子")
可変長引数の追加
可変長引数を使うことで、関数が受け取る引数の数を柔軟に設定できます。
位置引数の可変長引数 (*args)
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3, 4, 5)) # 15
キーワード引数の可変長引数 (**kwargs)
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="太郎", age=30, city="大阪")
クロージャを用いた機能追加
クロージャを使用すると、関数の動作を部分的にカスタマイズできます。
def multiplier(factor):
def multiply(n):
return n * factor
return multiply
double = multiplier(2)
triple = multiplier(3)
print(double(10)) # 20
print(triple(10)) # 30
デコレータによる機能追加
デコレータを使うと、既存の関数に新しい機能を追加できます。
def logger(func):
def wrapper(*args, **kwargs):
print(f"関数 {func.__name__} が呼び出されました")
return func(*args, **kwargs)
return wrapper
@logger
def say_hello():
print("こんにちは!")
say_hello()
クラスを使った関数の機能追加
関数の機能をクラスで拡張することも可能です。
class Counter:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
print(f"{self.func.__name__} が {self.count} 回呼び出されました")
return self.func(*args, **kwargs)
@Counter
def greet():
print("こんにちは!")
greet()
greet()
functools.partialを用いた機能追加
functools.partialを使うと、関数のデフォルト引数を事前に固定できます。
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
cube = partial(power, exponent=3)
print(square(4)) # 16
print(cube(4)) # 64