次に「プライベートな属性」についても話をしておこう。「プライベート」とは「内部で使うだけなので外部には見せたくない」という意味だ。これには幾つかの種類がある。モジュールやパッケージの内部で使うだけなので「from モジュール名 import *」で自動的にインポートされないようにしたい場合にどうすればよいかは、第23回「モジュールの作り方」の「公開したくないもの」や第24回「パッケージ」の「__init__.pyファイルと__all__変数とパッケージ内インポート」で取り上げた。
クラスを定義する際にも、メソッドが長くなったのでその内容を幾つかのメソッドに分割したり、複数のメソッドで共通に使う処理として取り出したりして、クラス内でのみ使用することが前提となるメソッドが存在するかもしれない。あるいは、クラス内でのみ保持しておき、外部からはそのクラスやインスタンスの属性として自由に触ってほしくはないデータもあるかもしれない。
そうしたメソッドやデータ(インスタンス変数やクラス変数)はクラスを利用する側から不用意に扱ってもらっては困る。Python以外のプログラミング言語では、そうした属性があるときには、実際にアクセスができない(メソッドを呼び出そうとしたり、インスタンス変数にアクセスしようとしたりするとエラーとなる)ようにする仕組みがある。だが、基本的にPythonにはそうした仕組みは存在しない。そこで、メソッドや変数の名前をアンダースコア「_」で始めることで、「これはプライベートな属性なので使わないようにしてね」ということを、クラスの利用者に伝えるようになっている。
以下に例を示す。
class Foo:
def __init__(self, name):
self._name = name # _nameはプライベート
def get_name(self):
return self._name
def set_name(self, new_name):
self._name = new_name
def show_attr(self):
print(dir(self))
このコードでは、インスタンス変数が「_name」とアンダースコア「_」で始まっているので、「_nameには直接触らないでね」ということを利用者に伝えている。そして、get_nameメソッドとset_nameメソッドを用意することで、直接アクセスせずにそれらのメソッドを使ってその値を取得したり、変更したりできるようにしている。
Copyright© Digital Advantage Corp. All Rights Reserved.