Pythonクラスのパブリック変数とプライベート変数とは?違いと使い方を解説
パブリック変数(公開変数)とは
Pythonでは、クラス外から任意の変数へアクセスしたり、メンバーメソッドを呼び出したりすることが言語レベルで制限されていません。
つまり、Pythonのすべての変数とメソッドはデフォルトでパブリック(公開)です。そのため、変数やメソッドを公開したい場合は、特別な記述をする必要がありません。以下の例を見てみましょう。
コード例
class Mug:
def __init__(self):
self.color = None
self.content = None
def fill(self, beverage):
self.content = beverage
def empty(self):
self.content = None
brownMug = Mug()
brownMug.color = "brown"
brownMug.fill('tea')
print(brownMug.color)
print(brownMug.content)このコード内のすべての変数とメソッドは、デフォルトでパブリックになっています。クラスの外部から自由に読み書きできることが分かります。
プライベート変数(非公開変数)とは
データメンバーをプライベートとして宣言するということは、クラスの外部からアクセスさせないようにすることを意味します。Pythonはこれを実現するために「ネームマングリング(name mangling)」と呼ばれる仕組みをサポートしています。
この機能により、先頭にアンダースコア2つ以上、末尾にアンダースコア1つ以下が付いたメンバー名は、自動的に _<クラス名><メンバー名> という形式へ変換されます。メンバーをプライベートにする方法を、以下の例で確認してみましょう。
コード例
class Cup:
def __init__(self, color):
self.__content = None # プライベート変数
def fill(self, beverage):
self.__content = beverage
def empty(self):
self.__content = NoneこのCupクラスでは、fill() メソッドと empty() メソッドを使ってのみ、中身の追加や排出ができるようになりました。__content にクラス外部から直接アクセスしようとすると、AttributeError が発生します。
ただし、ネームマングリングはあくまで「名前の変換」にすぎないため、次のような書き方をすると、実はまだアクセスできてしまいます。
redCup = Cup("red")
redCup._Cup__content = "tea"このように、Pythonのプライベート変数は厳密なアクセス制御ではなく、「この変数には外部から直接触らないでほしい」という開発者への合図として機能します。より堅牢なカプセル化を実現したい場合は、@property デコレータやゲッター・セッターメソッドの活用も検討するとよいでしょう。
-
Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説
本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(
-
Python 2.7.xとPython 3.xの主な違いとは?押さえておきたい5つのポイント
Python 2系と3系の違いの背景 Python 3.0は2008年12月にリリースされました。これは、それ以前のバージョンに存在した設計上の課題を是正するために開発されたものです。Python 3の基本理念は「古い書き方を取り除き、機能の重複を減らす」というものでした。 ただし、Python 3.0には後方互換性がありません。つまり、Python 2.xの構文で書かれたプログラムは、そのままではPython 3.xのインタプリタ上で実行できません。なお、バージョン2.7はPython 2.xシリーズにおける最後のメジャーリリースとなっています。 両バージョンの間には数多くの違いがありますが