Pythonにおけるアクセス修飾子

しばらくPythonから離れていたので、細かいところを忘れていたのでメモ。

アクセス制限

PythonにはJavaのようにprivateとかprotectedみたいなアクセス修飾子がない。「_(アンダーバー)」による規則として扱う。
「_」のようにアンダーバーがひとつの場合は、オブジェクトの中で使用する変数。やろうと思えばオブジェクトの外からアクセスできるけど、あくまでクラスを作った人の意図を表すものとして使用する。

「__」のようにアンダーバーが2つの場合は、外からは簡単にアクセスできなくなる変数、Javaで言うところのprivateみたいな感じ。

class Foo:
  def __init__(self, name):
    self._name = name
    self.__name = name

f = Foo('bar')
print(f._name)
print(f.__name)

一番下の行はエラーとなる。内部的な動きとしては__nameは難読化されてるだけで、アクセスしようと思えばできる。