メソッドのアクセス制御

メソッドに対して、プライベートとパブリックの概念しか無いらしい。何も指定しなければパブリック、メソッド名の前にアンダースコア2連続をつけるとプライベート、らしい。

class SkskAction:
    def func(self):
        print 'SkskAction - func()'
        return None

    def __priv(self):
        print 'SkskAction - priv()'
        return None

    def func_priv(self):
        return self.__priv()

dir(sa)
# ['_SkskAction__priv', '__doc__', '__module__', 'func', 'func_priv']

テスト

sa = SkskAction()

sa.func()
# SkskAction - main()

sa.func_priv()
# SkskAction - priv()

sa.__priv()
# エラー
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# AttributeError: SkskAction instance has no attribute '__priv'

sa._SkskAction__priv()
# SkskAction - priv()

期待してたのは「__priv は呼び出せません」っていうエラーだけど、実際は「__priv はありません」というエラーだった。あっれー?と思って dir() したら名前が変更されてるのが確認できたしね。

確かに名前が変更されてしまえばそのまま呼び出される可能性はないけど…テストする時くらいしか使い道が浮かばないや。むしろテスト用なのかしら。

って思ってたらドキュメントにかいてあったよママン。

というわけで、良いか悪いかは別にして、開発中は黙ってることにした。しぃーっ