カテゴリ: Python 更新日: 2026/02/04

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

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

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

生徒

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

先生

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

生徒

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

先生

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

生徒

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

先生

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

-

1. Pythonのカプセル化とは?役割とメリットを解説

1. Pythonのカプセル化とは?役割とメリットを解説
1. Pythonのカプセル化とは?役割とメリットを解説

カプセル化(Encapsulation)とは、オブジェクト指向プログラミングの重要な考え方の一つで、「データ(変数)とそれを操作するメソッド(関数)を一つのまとまりにし、外部から直接触れられないように保護すること」を指します。

イメージとしては、「中身が見えないお弁当箱」「カプセル剤」を想像してみてください。外側からは中身がどうなっているか分からず、決められた「フタ(インターフェース)」を通さない限り、中身を勝手にいじることができない仕組みのことです。

まずは、カプセル化をしていない「誰でも中身を書き換えられる状態」のコードを見てみましょう。プログラミング未経験の方でも、以下の流れを追ってみてください。


class User:
    def __init__(self, name):
        # self.nameは「公開」されている変数です
        self.name = name

# 「たろう」という名前でユーザーを作ります
user = User("たろう")

# 外側から勝手に名前を書き換えられてしまいます
user.name = "じろう"  
print(user.name)  # 実行結果: じろう

このように、外部から自由にデータを操作できる状態だと、例えば「名前を空っぽにされたくない」「年齢にマイナスの数値を入れられたくない」といったデータの整合性を守ることが難しくなります。また、大規模な開発では、誰かがどこかで変数を書き換えたせいで、思わぬバグが発生する原因にもなりかねません。

こうしたトラブルを防ぎ、プログラムの安全性と信頼性を高めるために、Pythonでは「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
Python
Pythonの変数スコープとは?初心者でもわかるローカル変数とグローバル変数の違い
New2
Python
PythonのNoneとは?NoneTypeの使い方とnullとの違いをわかりやすく解説
New3
Python
Pythonで文字列の長さを取得する方法!len()の基本と応用
New4
PHP
PHP のインストール方法(Windows・Mac・Linux)と開発環境
-
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonでファイルの更新日やサイズを取得する方法!初心者でもわかるos.stat()の使い方
No.2
Java&Spring記事人気No2
Python
Pythonで文字列が数値か判定する方法!isdigit()・isnumeric()の違い
No.3
Java&Spring記事人気No3
Python
Pythonの書き方を基本から解説!はじめてのPythonプログラム
No.4
Java&Spring記事人気No4
PHP
PHPでREST APIを作る方法を完全ガイド!初心者でもわかるAPI開発入門
No.5
Java&Spring記事人気No5
PHP
初心者向けにPHP でファイルを開く・読み込む・書き込む方法(fopen, fwrite, fread)を解説する記事
No.6
Java&Spring記事人気No6
PHP
PHP のインストール方法(Windows・Mac・Linux)と開発環境
No.7
Java&Spring記事人気No7
Python
Pythonのコンストラクタ(__init__)の使い方を解説!初心者でもわかるオブジェクトの初期化
No.8
Java&Spring記事人気No8
PHP
PHP の可変変数と変数の参照渡しを完全解説!初心者でも理解できる動的変数の使い方
-
-