Python でコンストラクターをオーバーロードする

Hemank Mehtani 2023年1月30日
  1. Python でコンストラクターをオーバーロードするための複数の引数の使用
  2. Python で@classmethod デコレータを使用してコンストラクタをオーバーロードする
Python でコンストラクターをオーバーロードする

複数のコンストラクターは、パラメーターに応じてカスタムクラスをカスタマイズするのに役立ちます。さまざまなパラメーターを使用しながら、さまざまなコンストラクターをトリガーできます。

Python では、複数のコンストラクターは直接サポートされていません。クラスに複数のコンストラクターが指定されている場合、最新のコンストラクターが前のコンストラクターをオーバーライドします。ただし、Python でコンストラクターをオーバーロードする別の方法がいくつかあります。

この記事では、これらの方法について説明します。

Python でコンストラクターをオーバーロードするための複数の引数の使用

関数のオーバーロードとは、同じ名前で異なるタイプのパラメーターを持つ異なる関数を持つことを指します。複数の条件を宣言することでコンストラクターをオーバーロードできます。すべての条件は異なる引数のセットに基づいています。

例えば、

class delftstack:
    def __init__(self, *args):
        if isinstance(args[0], int):
            self.ans = args[0]
        elif isinstance(args[0], str):
            self.ans = "Hello from " + args[0]


s1 = delftstack(1)
print(s1.ans)

s2 = delftstack("Delft")
print(s2.ans)

出力:

1
Hello from Delft

上記の例では、コンストラクターに 2つのタイプのパラメーターがあります。1つは文字列で、もう 1つは整数です。構成はオーバーロードされ、提供された引数のタイプに基づいて出力を提供します。

提供された引数の数に基づいてコンストラクターをオーバーロードすることもできます。この方法は前の例と似ています。

以下のコードを参照してください。

class delftstack:
    def __init__(self, *args):
        if len(args) > 3:
            self.ans = "More than three"
        elif len(args) <= 3:
            self.ans = "Less than three"


s1 = delftstack(1, 2, 3, 4)
print(s1.ans)

s2 = delftstack(1, 2)
print(s2.ans)

出力:

More than three

Less than three

Python で@classmethod デコレータを使用してコンストラクタをオーバーロードする

@classmethod デコレータを使用すると、クラスをインスタンス化せずに関数にアクセスできます。このようなメソッドには、クラス自体とそのインスタンスを介してアクセスできます。オーバーロードで使用される場合、そのような関数はファクトリメソッドと呼ばれます。それらを使用して、Python でコンストラクターのオーバーロードの概念を実装できます。

以下のコードを参照してください。

class delftstack(object):
    def __init__(self, a):
        self.ans = "a"

    @classmethod
    def first(cls):
        return "first"

    @classmethod
    def second(cls):
        return "second"


s1 = delftstack.first()

print(s1)

s2 = delftstack.second()

print(s2)

出力:

first

second

このメソッドは、コンストラクターをオーバーロードする最も Python 的な方法です。上記の例では、ファクトリメソッドの cls 引数はクラス自体を参照しています。

関連記事 - Python Constructor