カテゴリ: 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)
コメント
コメント投稿は、ログインしてください

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

関連記事:
カテゴリの一覧へ
新着記事
Pythonの例外発生の基本をマスター!初心者でもわかるraise文の使い方ガイド
Pythonでタプルの要素数を取得する方法(len()の使い方)初心者でもわかる数え方の基本
Pythonの辞書をデータフレーム(Pandas)に変換する方法 初心者向け完全ガイド
PHPでスパム対策!CAPTCHAの使い方を初心者向けにやさしく解説
人気記事
No.1
PHP&Python記事人気No1
Pythonの例外処理をやさしく解説!初心者でもわかるtry-exceptの基本と使い方
No.2
PHP&Python記事人気No2
PHPでJSONデータを扱う方法をやさしく解説!初心者でもわかるjson_encodeとjson_decode
No.3
PHP&Python記事人気No3
Pythonのデータ型変換まとめ!int, float, str, list などの変換方法
No.4
PHP&Python記事人気No4
PHPのデフォルト引数の設定方法をやさしく解説!初心者でも安心の入門ガイド
-