Python: カプセル化と継承の基礎

最終更新:2026-09-22

カプセル化はオブジェクトの内部詳細を隠し、安全な操作インターフェースのみを公開します。継承により、あるクラスは自動的に別のクラスの機能を持ち、繰り返しを避けられます。これら 2 つの概念はオブジェクト指向プログラミングの根幹です。


関連する組み込み関数:super()

1. カプセル化とプライベート属性

カプセル化とは、オブジェクトの内部データは外部から直接アクセスすべきでない——メソッドを通じて操作すべきであるという考え方です。

(1) シングルアンダースコア _ — 「保護された」属性の慣習

▶ サンプル:シングルおよびダブルアンダースコア

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功

シングルアンダースコアは単なる慣習であり、強制はされません——Python はアクセスを妨げません。これは「これは内部用です、触らないでください」とドキュメントに書くようなものです。

(2) ダブルアンダースコア __ — 名前マングリング

▶ サンプル:銀行口座クラス

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功

ダブルアンダースコアは名前マングリングをトリガーします——__balance は内部的に _BankAccount__balance に変換されます。これは真の「プライバシー」ではなく、偶発的なオーバーライドを防ぐためのものです。

💡 Python に真のプライベートはありません。 「私たちはすべて責任ある大人である」という理解に基づいています——シングルアンダースコアは「内部使用」、ダブルアンダースコアは名前の衝突を防ぎます。他の言語(Java など)には真の private キーワードがありますが、Python にはなく、追加する予定もありません。

▶ サンプル:Temperature クラス(難易度 ⭐⭐)

▶ 試してみよう

出力:

TEXT 📖 参照専用
Temperature cannot be below absolute zero!


2. @property:エレガントなアクセス制御

set_celsius()/get_celsius() を書くのは冗長です。@property を使うと、属性アクセスの構文を保ちながらアクセスを制御できます:

▶ サンプル:@property の使用

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功
💡 @property の利点: 1)アクセスに括弧不要:t.celsius は t.get_celsius() より簡潔。2)代入時の自動検証:t.celsius = value は t.set_celsius(value) より簡潔。3)通常の属性を計算属性に変換しても、既存のコードを壊さない。



3. 継承

継承により、子クラスは親クラスのすべての属性とメソッドを持てます:

▶ サンプル:Animal の継承

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功

(1) super():親メソッドの呼び出し

▶ サンプル:super() で親を呼び出す

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功


4. Mixin パターン

Mixin は特殊なクラスです——独立して使われるのではなく、他のクラスに機能を追加するために「ミックスイン」されます:

▶ サンプル:Mixin パターン

▶ 試してみよう

出力:

TEXT 📖 参照専用
# 函数定义成功
💡 Mixin 命名規則: クラス名が Mixin で終わるものは、ミックスイン用であり、独立して使うためのものではないことを示します。クラスは複数の Mixin と 1 つのメインベースクラスをミックスインできます——深い単一継承よりもはるかに柔軟です。



5. よくあるユースケース


関連する組み込み関数:super()

❓ よくある質問

Q 継承と Mixin はいつ使い分ければよいですか?
A 継承は「is-a」関係に適しています——犬は動物です。Mixin は「has-a ability」に適しています——アヒルは泳げます。継承よりも合成(Mixin)を優先してください。深い継承階層は保守が困難です。良いルール:継承は 3 レベルを超えないこと。
Q @property と通常のメソッドの違いは何ですか?
A @property はメソッドを属性のように見せます——アクセスに括弧は不要、代入はセッターをトリガーします。本質的には「属性インターセプター」です——属性を操作しているかのようにコードを書きますが、実際にはメソッドが実行されます。
Q Python は多重継承をサポートしていますか?落とし穴はありますか?
A はい——class C(A, B)。ただし、多重継承には「ダイヤモンド問題」(両方の親に同じ名前のメソッドがある場合、どちらを使うか)があります。Python は MRO(メソッド解決順序)を使用し、左から右に検索します。Mixin は多重継承を活用するデザインパターンで、Mixin クラスは小さく機能的に独立しており、ダイヤモンド問題を回避します。

📖 まとめ


📝 練習問題

  1. 初級(難易度 ⭐):Product クラスを定義し、price 属性に @property を使用——設定時は正の値であることを要求、取得時は元の値を返す。

  2. 中級(難易度 ⭐⭐):3 レベルの継承 Animal → Mammal → Dog/Cat を定義。Animal は name と age を持ち、Mammal は fur_color を追加、Dog と Cat はそれぞれ独自の speak() メソッドを実装。

  3. 上級(難易度 ⭐⭐⭐):ログシステムを作成。LoggableMixin(log_info()、log_error() メソッドを提供)と基底クラス Application(name 属性を持つ)を使用。WebApp と CLIApp の両方が Application を継承し、LoggableMixin をミックスインしてログ機能を実装。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%