理系母の趣味はプログラミング

理系院卒、メーカー技術職の二児の母が、PythonやVBAで色々と作ってアップしていくブログです。

【23日目】オブジェクト指向プログラミング⑦コンポジションな関係を作る

こんばんは、なぺです。

前回までで、オブジェクト指向プログラミングの4大要素を学びました。
今回は、もうひとつ重要なコンセプト、コンポジションについて学びます。

さて、
コンポジション

本にはこう書いてあります。

コンポジション:別クラスのオブジェクトを変数として持たせること。「has-a関係」


ふむふむ
変数にオブジェクトを入れることができるのね!

ちょっとやってみます。
前回作った親子クラスのコードを使って、子のインスタンス変数に親を入れます。

class Parent:
    def __init__(self,n,o):
        self.name = n
        self.old = o

class Child:
    def __init__(self,n,p):
        self.name = n
        self.parent = p

takeko = Parent('takeko',50)
umeko = Child('hanako',takeko) #Childクラスの変数にParentクラスのオブジェクトを入れる
print(umeko.parent.name)
#出力結果
takeko

Childクラスのオブジェクト(umeko)の親としてParentクラスのオブジェクト(takeko)を入れました。
よしよし。

次は前回の継承とコンポジションの合わせ技!

class Parent:
    def __init__(self,n,o,p):
        self.name = n
        self.old = o
        self.parent = p

class Child(Parent): #継承
    pass

takeko = Parent('takeko',50,'matsuko')
umeko = Child('hanako',15,takeko) #コンポジション
print(takeko.parent)
print(umeko.parent)
print(umeko.parent.name)
#出力結果
matsuko #takekoのparentは文字列で入力したので、そのまま出力される。
<__main__.Parent object at 0x000001C80A322688> #umekoのparentはオブジェクトを渡したので、.parentだけだとメモリ上の場所が表示されてしまう。
takeko #parent.nameと指定したので、takekoオブジェクトのname変数が表示された。

できたっぽい。
継承もコンポジションも、コードを少なくできるのはいいですね。(多分)

今日は以上です!

まだまだ続くよオブジェクト指向


参考書はこちらです
「独学プログラマー

それではまた^^