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
引数はクラス自体を参照しています。