カテゴリ: Python 更新日: 2025/11/23

Pythonのカプセル化とは?private変数とプロパティの活用方法をやさしく解説

Pythonのカプセル化とは?private変数とプロパティの活用方法
Pythonのカプセル化とは?private変数とプロパティの活用方法

先生と生徒の会話形式で理解しよう

生徒

「Pythonで変数を外から勝手に変えられないようにする方法ってありますか?」

先生

「はい、それは『カプセル化』という仕組みで、private(プライベート)変数を使えば制限できますよ。」

生徒

「カプセル化?なんだか難しそうですね…」

先生

「だいじょうぶ!お弁当箱を思い出してみてください。中身はフタを開けないと見えませんよね。それと同じような仕組みなんです。」

生徒

「なるほど、フタがあると勝手に触れないってことですね!」

先生

「そうです。それでは、Pythonのカプセル化とprivate変数・プロパティの使い方を一緒に学んでいきましょう!」

-

1. Pythonのカプセル化とは?

1. Pythonのカプセル化とは?
1. Pythonのカプセル化とは?

カプセル化(カプセルか)とは、「データ(変数)をクラスの中に閉じ込めて、外から直接アクセスできないようにすること」です。まるで中身の見えないお弁当箱のように、必要なときだけ取り出せるようにします。

たとえば、以下のようにクラスの中で変数を定義すると、外から自由に変更されてしまいます。


class User:
    def __init__(self, name):
        self.name = name

user = User("たろう")
user.name = "じろう"  # 外から自由に変更できる

これでは誰でも勝手に変更できてしまい、セキュリティや整合性に問題が出る可能性があります。そこで登場するのが「private変数」です。

2. private変数の書き方とアクセス方法

2. private変数の書き方とアクセス方法
2. private変数の書き方とアクセス方法

Pythonでは変数名の前に__(アンダースコア2つ)をつけると、それは「private(プライベート)」扱いになり、外から直接アクセスできなくなります。


class User:
    def __init__(self, name):
        self.__name = name  # プライベート変数

user = User("たろう")
print(user.__name)  # エラーになります

AttributeError: 'User' object has no attribute '__name'

このようにエラーになります。ではどうやって中身を読み取るかというと、「プロパティ(property)」を使います。

3. プロパティ(property)で安全にアクセスしよう

3. プロパティ(property)で安全にアクセスしよう
3. プロパティ(property)で安全にアクセスしよう

プロパティとは、「見た目は変数だけど、実際は関数のように中で何か処理をしてくれる仕組み」です。外から安全にアクセスできるように、読み取り用と書き込み用を別々に定義できます。

以下がその例です:


class User:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name  # 読み取り専用

    @name.setter
    def name(self, new_name):
        if new_name != "":
            self.__name = new_name  # 安全に書き換え

user = User("たろう")
print(user.name)     # → たろう
user.name = "じろう"  # セッター経由で書き換え
print(user.name)     # → じろう

4. カプセル化が便利な理由とは?

4. カプセル化が便利な理由とは?
4. カプセル化が便利な理由とは?

なぜカプセル化が便利なのか、理由は以下のとおりです:

  • 外から勝手に書き換えられないので安全
  • 不正な値(空文字や数字など)をチェックできる
  • 後で中身の処理を変更しても、外側のコードはそのままでOK

たとえば以下のように空文字を拒否するような処理も入れられます。


    @name.setter
    def name(self, new_name):
        if new_name == "":
            print("名前は空にできません!")
        else:
            self.__name = new_name
-

5. わかりやすいたとえ話:自動販売機とカプセル化

5. わかりやすいたとえ話:自動販売機とカプセル化
5. わかりやすいたとえ話:自動販売機とカプセル化

カプセル化をもっと簡単に言うと、「自動販売機」のようなイメージです。飲み物の中身(データ)は見えませんが、お金を入れてボタンを押す(関数)ことでだけ、中身を安全に取り出せます。

お客さんは缶ジュースの中身を直接触れません。機械(クラス)のルールに従って、正しく取り出すしかない。これがカプセル化です。

6. よくあるミスと注意点

6. よくあるミスと注意点
6. よくあるミスと注意点

Pythonのprivate変数は実は「完全に隠れている」わけではなく、名前の前に_クラス名__変数名の形でアクセスできてしまいます。これは「名前改変(ネームマングリング)」と呼ばれる仕組みです。

つまり、下記のように無理やりアクセスできます。


user = User("たろう")
print(user._User__name)  # → たろう(あまり使わない)

これは基本的に避けたほうがよい書き方です。ちゃんと@propertyでアクセスしましょう。

7. Pythonのカプセル化と他の言語の違い

7. Pythonのカプセル化と他の言語の違い
7. Pythonのカプセル化と他の言語の違い

JavaやC++などの言語ではprivateキーワードで完全に変数を隠しますが、Pythonは「やさしい制限」です。開発者のマナーや意図を尊重する形で制限しているため、「触れようと思えば触れてしまう」特徴があります。

ですが初心者にとってはそのやさしさがありがたいところ。きちんとプロパティを使えば、立派なオブジェクト指向のコードになります。

8. 練習問題:名前と年齢をカプセル化してみよう

8. 練習問題:名前と年齢をカプセル化してみよう
8. 練習問題:名前と年齢をカプセル化してみよう

次のようなクラスを作って、private変数とプロパティを使ってみましょう。

  • 変数:名前(name)と年齢(age)をprivateで持つ
  • nameは空でないことをチェック
  • ageは0歳以上のみOK

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        if value != "":
            self.__name = value

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        if value >= 0:
            self.__age = value

person = Person("はなこ", 25)
print(person.name)
person.age = -5  # 無視される
print(person.age)
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
カテゴリの一覧へ
新着記事
New1
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
New2
PHP
PHPのスコープとは?グローバル・ローカル・スーパーグローバルを完全解説!
New3
PHP
PHPの演算子をやさしく解説!算術・比較・論理・ビット演算子の使い方
New4
PHP
PHP の変数とは?基本的な使い方とデータ型を徹底解説!
-
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonで辞書のキー・値・アイテムを取得する方法(keys(), values())
No.2
Java&Spring記事人気No2
Python
Pythonで辞書のネスト構造(入れ子辞書)を扱う方法 初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Python
Pythonでエラースタックトレースを表示・取得する方法を徹底解説!初心者向け例外処理入門
No.4
Java&Spring記事人気No4
Python
PythonでMySQLに接続する方法を完全解説!初心者でもわかるpymysqlの基本
No.5
Java&Spring記事人気No5
Python
PythonでExcelファイル(.xlsx)を操作する方法を徹底解説!初心者でもできるopenpyxl・pandasの使い方
No.6
Java&Spring記事人気No6
PHP
PHPで画像ファイルをアップロードする方法を初心者向けに徹底解説!わかりやすい画像処理入門
No.7
Java&Spring記事人気No7
PHP
PHP の日付と時間の取得(date, time, strtotime)を完全解説!初心者でもわかる使い方
No.8
Java&Spring記事人気No8
PHP
PHP のデータ型を完全ガイド!初心者でもわかる int, string, float, bool など
-
-