【Python】デコレータを用いて関数に機能を追加する

【Python】デコレータを用いて関数に機能を追加する

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です