Pythonのカプセル化

Pythonのオブジェクトとインスタンス
目次

カプセル化

カプセル化(Encapsulation)とは、オブジェクトの内部を外部から隠蔽し、オブジェクトの状態を保護する仕組みです。

りある

わけわからんひとに、プログラムの中身を書き換えられないようにする仕組みだね。

ロボ君

外部からの干渉を無くして、プログラムの動作を安定させる仕組みダヨ。

アクセス制御

アクセス制御は、クラスの属性やメソッドへのアクセスを制御する仕組みを指します。
ですが、Pythonの公式ドキュメントで

Python では、データ隠蔽を補強するための機構はなにもありません

https://docs.python.org/ja/3/tutorial/classes.html#class-attributes:~:text=Python%20%E3%81%A7%E3%81%AF%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E9%9A%A0%E8%94%BD%E3%82%92%E8%A3%9C%E5%BC%B7%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A7%8B%E3%81%AF%E3%81%AA%E3%81%AB%E3%82%82%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93

ということなので、慣習やマングリング(難号化)を使ってアクセス制御します。

プライベートとパブリック

パブリック(Public)

Pythonではデフォルトで属性やメソッドは公開されており、どこからでもアクセスできます。
これは、クラス内で定義した属性やメソッドがクラスの外部から直接アクセスできることを意味します。

class MyClass:
    def __init__(self):
        self.public_age = 54

    def public_method(self):
        return "パブリックなメソッド"

obj = MyClass()
print(obj.public_age)       # パブリックな属性
print(obj.public_method())  # パブリックなメソッド


# 実行結果
# 54
# パブリックなメソッド
プライベート(Private)

Pythonでは、アンダースコア_で始まる属性やメソッドは、非公開とされます。
例えば、_private_age_private_method() のように、名前がアンダースコアで始まるものは、クラスの外部から直接アクセスすべきでないという暗黙の了解です。

class MyClass:
    def __init__(self):
        self._public_age = 54
 
# _public_varにはアクセスしないようにしようぜ的な_

_を付けた属性に外部からアクセスしないようにする。

りある

暗黙の「了解!」

プライベートな属性やメソッドは、クラスの外部から直接アクセスすることが難しくなります。
通常、プライベートな属性やメソッドにアクセスするためには、ゲッターとセッターのメソッドを使用することが推奨されています。

例:ゲッターとセッターを使ったプライベートな属性へのアクセス

class MyClass:
    def __init__(self):
        self.__private_age = 54

    def __private_method(self):
        return "プライベートなメソッド"

    def get_private_age(self):
        return self.__private_age

    def set_private_age(self, value):
        self.__private_age = value

obj = MyClass()
# 以下の行は通常はエラーになります(プライベート属性への直接アクセス)
# print(obj.__private_age)
# print(obj.__private_method())

# プライベートな属性にアクセスするには、ゲッターとセッターを使用
print(obj.get_private_age())
obj.set_private_age(100)
print(obj.get_private_age())

# 実行結果
# 54
# 100
ゲッターとセッター(Getter and Setter)

ゲッターは属性の値を取得し、セッターは属性の値を設定するメソッドです。
これにより、属性へのアクセスを制御し、値の検証や変換を行うことができます。

プロパティ(Property)

Pythonでは、@property デコレータを使用して、属性のゲッター(getter)メソッドを定義できます。
これにより、属性にアクセスする際にメソッドを呼び出すようにアクセスを制御できます。

カプセル化のメリット

カプセル化はオブジェクト指向プログラミングの基本原則で、コードの保守性と拡張性を向上させます。
プライベート属性を通じて属性の変更を管理し、クラスの内部実装の詳細を隠すことができます。

  • オブジェクトの状態を不正に変更されるのを防ぐことができる。
  • オブジェクトの状態を理解しやすくすることができる。
  • オブジェクトを再利用しやすくなる。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次