HOWTO · Python

Python のポリモーフィズム

このチュートリアルでは、Python のポリモーフィズムについて説明します。

このページの内容

ポリモーフィズムは OOP の特徴であり、単一の名前が異なる機能を持つことができることを意味します。 1つのエンティティがさまざまな形をとることができます。

このチュートリアルでは、ポリモーフィズムが Python でどのように実装されるかを示します。

Python のポリモーフィズム

これを理解する最善の方法は、len() 関数を使用することです。 この関数は、オブジェクトによって解釈が異なります。

リストの場合は、存在する要素の合計と文字列の場合、および存在する文字の合計を返します。

コード:

lst = ["delft", "stack"]
s = "delftstack"
print(len(lst), len(s))

出力:

2 10

Python のポリモーフィズムを示すもう 1つの一般的な機能は、+ 演算子です。 この演算子は、Python で 2つの数値間の加算を実行できます。

ただし、文字列で使用すると、2つの文字列を結合する連結演算子として機能します。

コード:

a = 5 + 6
s = "delft" + "stack"
print(a, s)

出力:

11 delftstack

Python でポリモーフィズムにクラス メソッドを使用する

Python ではすべてがオブジェクトであり、何らかのクラスに属しています。 メソッドは、クラスのオブジェクトに関連付けられています。

これが、+ 演算子と len() 関数が異なるオブジェクトに対して異なる機能を実行する理由です。 + 演算子は、オブジェクトごとに異なる定義のマジック関数を呼び出します。

クラスを作成してこれを実現できます。 2つのクラスが同じ名前の関数を持つことができますが、目的と定義は異なります。

コード:

class A:
    def fun(self):
        print("Class A")


class B:
    def fun(self):
        print("Class B")


ob1 = A()
ob2 = B()
for i in (ob1, ob2):
    i.fun()

出力:

Class A
Class B

Python でポリモーフィズムにメソッド オーバーライドを使用する

Python では、ポリモーフィズムはクラス継承にも関連付けられています。 継承とは、別のクラスの機能にアクセスするクラスを指します。

クラスとそのサブクラスには同じ名前の関数が含まれる場合があり、Python で関数のオーバーライドを使用できます。 メソッドのオーバーライドを使用して、既に定義されているメソッドを子クラスに実装できます。

子クラスに応じて関数を再定義できます。

コード:

class A:
    def fun(self):
        print("Class A")


class B(A):
    def fun(self):
        print("Class B")


ob1 = A()
ob2 = B()
for i in (ob1, ob2):
    i.fun()

出力:

Class A
Class B

上記のコード例では、クラス B はクラス A を継承していますが、fun() メソッドはクラス B でオーバーライドされ、クラスに従って定義されています。

オーバーライドされた関数のクラス A から関数 fun() にアクセスすることもできます。

コード:

class A:
    def fun(self):
        print("Class A")


class B(A):
    def fun(self):
        A.fun(self)
        print("Class B")


ob2 = B()
ob2.fun()

出力:

Class A
Class B

Python でポリモーフィズムに関数と演算子のオーバーロードを使用する

関数のオーバーロードは、ポリモーフィズムを実装する興味深い機能です。 この機能は Python では利用できず、最後に定義された関数が Python で呼び出されます。

Python では演算子をオーバーロードできます。 + 演算子で明確にわかるように、オブジェクトの種類に基づいて、さまざまな演算子がさまざまな機能を実行できることがわかっています。

これは、オペレーターが使用されるたびに内部でマジック関数を呼び出すために発生します。 たとえば、+ 演算子は __add__ メソッドを内部的に呼び出します。

この魔法の関数には、名前の前後に 2つのアンダースコアがあります。 マジック関数は直接呼び出されることを意図したものではありませんが、さまざまなクラスに対してそれらを定義して、さまざまなオペレーターの動作を変更できます。

コード:

class A:
    def __init__(self, a):
        self.a = a

    def __add__(self, o):
        return self.a + o.a + 2


ob1 = A(5)
ob2 = A(4)
print(ob1 + ob2)

出力:

11

上記の例では、クラス A のマジック関数を変更し、結果に 2 を追加することで、+ 演算子をオーバーロードしました。