メモ程度に記載します。
「_関数」について
Pythonには事実上のPrivate属性が無いですが、_で関数を内部用に定義できる
module/func.py
def _func():
return something
module/__init__.py
from .module import func
上記の場合、
test.py
from module import *
print(func._func())
ImportError: cannot import name 'func' from 'module.func'
from M import * では一つのアンダースコアで始まる関数はインポートされません
しかし、
module/func.py
class Net():
def _func(self):
return 'something'
module/__init__.py
from .module import Net
上記の場合、
test.py
from module import *
print(Net()._func())
呼び出せる。
つまり、import *
の呼び出しの__init__.py
で、
module/__init__.py
from .module import _変数
という記述ができない為。
※重要
import *の記述でなければ、_func()は使用できる
「__関数」について
上記で説明した機能も勿論、合わせ持ち、ネームマングリング機構を呼び出す。
本来、ネームマングリング機構は
親クラスと子クラス間での名前衝突を避ける目的の為のもの。
module/func.py
class Net():
def __func(self):
return 'something'
module/__init__.py
from .module import Net
上記の場合、
test.py
from module import *
print(Net()._Net_func())
_Net_func()の呼び出しに変わり、擬似的にprivate属性を作成できる
「__関数__」について
magic methodになる。
__init__
や__call__
、__iter__
等既存のmagic methodがある。
これによって、クラスを綺麗に書ける。
普段の開発では自分で新しく定義しないようにする。