LoginSignup
44
33

pythonのカプセル化とマングリングについて

Last updated at Posted at 2019-05-07

pythonにはprivate変数はありません。

しかしprivate変数に近いことは実現できます。

##「」1つのprefix##
PEP8上のコーディング規約としては
」1つのprefixをclass内のみで利用する変数とされています。

この変数はfrom M import *とした場合、
importされません。

しかし、この変数は
インスタンス化したオブジェクトからのアクセス時には
物理的な機構はなくカプセル化としての役目は果たせません。

##「」2つのprefix##
」2つのprefixをつけた場合、
ネームマングリング機構が働きます。

Name Manglingとは名前修飾という意味で、
該当のprefixが付いている変数にはpythonコード上で意味が与えられます。

該当の変数名は「_class名」のprefixがついた変数名へと
置換されます。

ただし、これもあくまで変数名が置換されるために
通常のような、インスタンスからの変数名へのアクセスが
できなくなるだけです。
通常よりは硬い実装にはなりますね。

あくまで変数名が変わっているだけなので
置換後の変数名へのアクセスは許します。

本来、ネームマングリング機構は
親クラスと子クラス間での名前衝突を避ける目的の為のもののようです。
(__init__や、__main__などのメソッドの所属元クラスをはっきりさせる)

class HogeHoge:
    _dummy_prv = "hoge"
    __almost_prv = "hoge"

class Main:
    hogehoge = HogeHoge()
    
    # 丸見え
    a = hogehoge._dummy_prv

    # エラー
    b = hogehoge.__almost_prv

    # こうするとアクセスでちゃう
    c = hogehoge._HogeHoge__almost_prv

参考

pep8-ja 1.0 ドキュメント
python学習講座 プライベートメンバ

44
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
33