Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでデータを隠す方法:プライベート属性とネームマングリングの基本

オブジェクトの属性(アトリビュート)は、クラス定義の外部から見える場合と見えない場合があります。Pythonでは、属性名の先頭にアンダースコア2つ(__)を付けることで、その属性をクラス外から直接参照できないようにできます。これがPythonにおける「データ隠蔽(カプセル化)」の基本的な手法です。

サンプルコード

#!/usr/bin/python
class JustCounter:
    __secretCount = 0

    def count(self):
        self.__secretCount += 1
        print(self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print(counter.__secretCount)

実行結果

上記のコードを実行すると、次のような結果になります。

1
2
Traceback (most recent call last):
  File "test.py", line 12, in <module>
    print(counter.__secretCount)
AttributeError: 'JustCounter' object has no attribute '__secretCount'

クラスの外側からプライベート属性へアクセスしようとすると、このように AttributeError が発生します。これは、Pythonが内部的に属性名を書き換えて保護しているためです。この仕組みは「ネームマングリング」と呼ばれ、属性名は自動的に _クラス名__属性名 という形式に変換されます。

ネームマングリングされた属性へのアクセス方法

変換後の名前を使えば、object._className__attrName の形式で外部からでもアクセス可能です。先ほどのコードの最終行を次のように置き換えてみましょう。

.........................
print(counter._JustCounter__secretCount)

実行結果:

1
2
2

補足:シングルアンダースコアとの違い

先頭にアンダースコア1つだけを付けた属性(_attr)は、言語レベルでの制限はなく、「外部から使用しないでほしい」という開発者間の慣習的な合図です。一方、アンダースコア2つ(__attr)を付けると、前述のネームマングリングによって名前が書き換えられるため、サブクラスでの属性名の衝突を防ぐ効果もあります。

ただし、これらの仕組みはあくまでアクセスを「難しくする」ためのものであり、他の言語のような厳密な private 機構ではない点には注意してください。実際の開発では、外部公開するAPIとして意図していない属性には、この命名規則を適切に使い分けることが推奨されています。

  1. Pythonで顧客離反(チャーン)を予測する方法:機械学習による実践ガイド

    あらゆるビジネスは顧客のロイヤルティに依存しています。リピート購入は企業の収益性を支える重要な柱の一つであり、顧客が離れていく理由を把握することは極めて重要です。このように顧客が離反していく現象は「カスタマーチャーン(Customer Churn)」と呼ばれます。過去の傾向を分析することで、どのような要因が顧客離反に影響を与えているのかを把握し、特定の顧客が離反するかどうかを予測できるようになります。本記事では、機械学習アルゴリズムを使って過去の顧客離反データの傾向を分析し、どの顧客が離反する可能性が高いかを判定する方法を解説します。データの準備例として、通信業界(Telecom)の顧客離反デ

  2. Pythonで国勢調査データを分析する方法|インドの人口統計データを可視化してみよう

    国勢調査(センサス)とは、特定の対象人口に関する情報を体系的に記録・収集する取り組みです。収集されるデータには、人口統計、経済状況、居住環境など、さまざまなカテゴリの情報が含まれています。これらのデータは、政府が現状を正確に把握し、将来に向けた政策立案を行ううえで重要な基礎資料となります。本記事では、Pythonを活用してインドの国勢調査データを分析する方法を解説します。人口動態や経済指標など複数の観点からデータを掘り下げ、その結果をグラフとして視覚的に表現します。使用するデータセットはKaggleから入手した「India Districts Census 2011」です。データの準備と読み込