カプセル化
カプセル化(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)メソッドを定義できます。
これにより、属性にアクセスする際にメソッドを呼び出すようにアクセスを制御できます。
カプセル化のメリット
カプセル化はオブジェクト指向プログラミングの基本原則で、コードの保守性と拡張性を向上させます。
プライベート属性を通じて属性の変更を管理し、クラスの内部実装の詳細を隠すことができます。
- オブジェクトの状態を不正に変更されるのを防ぐことができる。
- オブジェクトの状態を理解しやすくすることができる。
- オブジェクトを再利用しやすくなる。