Select Language

AI Technology Community

7.9、Pythonクラスのプライベート属性

C++ と Java では、属性(メンバー)にアクセス制御があります。たとえば、public は任意のコードがその属性にアクセスできることを表し、private は現在のクラスのコードのみがその属性にアクセスできることを表します。

Python ではこのアクセス制御子はありませんが、属性の前に __ という2つの下線を付けることで、その属性がクラスの外部からアクセスできないことを表すことができます。一般的な属性はクラスの外部からアクセスできますが、2つの下線(__)で始まる属性はクラスの外部からアクセスできません。

以下の例ではこの状況を示しています:

>>> class Student:                     # クラスを定義する
...   __version = "1.0"                # 非公開の属性
...   version = "1.1"                  # 通常の属性
...                                    # クラス属性の定義完了
...   def __init__(self):              # 初期化関数
...     self.__private_attr = 88       # 非公開の属性__private_attrを定義する
...     self.private_attr = 89         # 通常の属性private_attrを定義する
...                                    # クラス定義終了
>>> Student.version                    # クラス属性を確認する
'1.1'
>>> Student.__version                  # 非公開のクラス属性はアクセスできない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class Student has no attribute '__version'
>>> student_obj1 = Student()           # クラスのインスタンスオブジェクトを作成する
>>> student_obj1.version               # 通常の属性を確認する
'1.1'
>>> student_obj1.__version             # 非公開の属性を確認すると、例外が発生する
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Student instance has no attribute '__version'
>>> student_obj1.private_attr          # 通常の属性を確認する
89
>>> student_obj1.__private_attr        # 非公開の属性を確認すると、例外が発生する
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Student instance has no attribute '__private_attr'


post
  • 10

    item of content
前の章では、リストや辞書などのPythonの予め定義されたデータ型について説明しました。しかし、自分で新しいタイプを定義したい場合、クラスを使用する必要があります。つまり、クラスを使用することで自分だけのデータ型を定義でき、システムで定義された型だけを使う以上のことができます。
クラスはオブジェクト指向プログラミングにおいて非常に基本的な概念であり、最も基本的な機能は新しいデータ型を作成することです。さらに、クラスAから新しいクラスBを派生させることができ、その際クラスBはクラスAのすべての属性を継承します(これを継承機能と呼びます)。
この章では、クラスの定義と使用方法について説明します。具体的には、クラスのプロパティとメソッド、クラスの派生方法、多重継承の使用方法などを解説します。