Python のネストされたクラス

Manav Narula 2021年2月12日
Python のネストされたクラス

クラスには異なるデータのメンバや関数が含まれており、これらのメンバにアクセスするためのオブジェクトを作成することができます。

オブジェクト指向プログラミング言語である Python には、このような異なるクラスのオブジェクトがたくさんあります。Python では __init__ という重要なコンストラクタがあり、これはクラスのインスタンスが作成されるたびに呼び出され、また、クラスの現在のインスタンスを参照するための self キーワードも持っています。

入れ子になったクラス (内部クラスとも呼ばれます) は、別のクラスの中で定義されます。これはすべてのオブジェクト指向プログラミング言語で非常に一般的に使われており、多くの利点があります。実行時間を改善するわけではありませんが、関連するクラスをまとめてグループ化することで、プログラムの可読性やメンテナンスを助けたり、入れ子になったクラスを外部から隠したりすることができます。

次のコードは、入れ子になったクラスの非常にシンプルな構造を示しています。

class Dept:
    def __init__(self, dname):
        self.dname = dname

    class Prof:
        def __init__(self, pname):
            self.pname = pname


math = Dept("Mathematics")
mathprof = Dept.Prof("Mark")

print(math.dname)
print(mathprof.pname)

出力:

Mathematics
Mark

内部クラスに直接アクセスできないことに注意してください。オブジェクトは outer.inner 形式で作成します。

外部クラスの入れ子のクラスにはアクセスできますが、その逆はできません。外部クラスの入れ子になったクラスにアクセスするには、outer.inner 形式か self キーワードを利用します。

以下のコードでは、上記のクラスに少し手を加えて、親クラスを使って入れ子クラスの関数にアクセスしています。

class Dept:
    def __init__(self, dname):
        self.dname = dname
        self.inner = self.Prof()

    def outer_disp(self):
        self.inner.inner_disp(self.dname)

    class Prof:
        def inner_disp(self, details):
            print(details, "From Inner Class")


math = Dept("Mathematics")

math.outer_disp()

出力:

Mathematics From Inner Class

Python では複数の入れ子クラスを持つこともできます。このような状況は、1つ以上の内部クラスを持つ複数のネストされたクラスと呼ばれています。

また、ネストされたクラスの中にネストされたクラスを持つ場合もあり、これをマルチレベルネストクラスと呼びます。

次のコードは、マルチレベルネストクラスの非常に簡単な例を示しています。

class Dept:
    def __init__(self, dname):
        self.dname = dname

    class Prof:
        def __init__(self, pname):
            self.pname = pname

        class Country:
            def __init__(self, cname):
                self.cname = cname


math = Dept("Mathematics")
mathprof = Dept.Prof("Mark")
country = Dept.Prof.Country("UK")

print(math.dname, mathprof.pname, country.cname)

出力:

Mathematics Mark UK
著者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

関連記事 - Python Class