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

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

【19日目】オブジェクト指向プログラミング③カプセル化について知る

こんばんは、なぺです。
前回、オブジェクト指向プログラミングの書き方を学びました。
オブジェクト指向プログラミングには、カプセル化、抽象化、ポリモーフィズム、継承という4つの主要な概念があります。
今回はそのうちの一つ、カプセル化を学びます。

カプセル化には2つの概念があります。

一つ目は「オブジェクトによって複数の変数(状態を保持します)とメソッド(状態を変更したり状態を使用して計算したりします)をまとめること」です。

例えば前回書いた下記のコード

class Rectangle():
    def __init__(self, w, l): #1
        self.width = w
        self.len = l

    def area(self): #2
        return self.width * self.len

    def change_size(self, w, l): 
        self.width = w 
        self.len = l 

#1のところでは、複数の変数(wとl )がインスタンス変数として保持されています。
#2のところでは、オブジェクトの状態を使用して面積を計算するメソッドを定義しています。
これらがオブジェクトの単位にまとめられています。これがカプセル化です。

2つ目は、「データをクラス内に隠蔽して外から見えないようにすること」です。
クラスの中のデータは、メソッドを通じて操作させるようにすることで、外から隠蔽してしまいます。


ん?でもたしか、インスタンス変数って、"オブジェクト.インスタンス変数=xxx"と書けば直接書き換えられたような…。
と思ったのですが、どうやらタプルのように変更不可なデータを設定することで、直接書き換えられないようにできるみたいです。
となるとメソッドを通じてでないと、データ変更不可となります。

ここでpython先輩に物申す。

「でもPython先輩、メソッド使えば書き換えられるんですよね?
それじゃカプセル化って言わないじゃないですか。
他のプログラミング言語さん方はプライベート変数やプライベートメソッドを定義して外側から書き換えられないようにしてるらしいっすよ。」

するとPython先輩、こう答えました。

「確かに、私にプライベートはない。常にパブリックだ。だからメソッドとか変数名の前にアンダースコア(_)つけてたら、それには触れてはいけないという決まりを作った。もし使ったら、どうなっても自己責任な^^」

えー!

どうやら
_unsafe_method(self) のように、メソッド名の前にアンダースコアがついている場合、それには触ってはいけないという、暗黙のルールがあるみたいです。
使えるっちゃ使えるけど、保証外ですと、自己責任だと。

どうせなら使えなくしてほしい…。(てか使えなくする方法ないの...?)
なんか腑に落ちないけど、これがカプセル化らしいです。

今日は以上です。
文章だらけになってしまった

参考書はこちらです。

それではまた^^