無駄に時間使ったので備忘録
メソッド名にアンダースコア1つ
class Hoge:
# アンダースコアなし
def foo(self):
print("called foo")
# アンダースコア1つ
def _bar(self):
print("called bar")
def main():
hoge = Hoge()
hoge.foo()
hoge._bar()
これは想定通りの挙動
called foo
called bar
アンダースコア2つ
class Hoge:
# アンダースコア2つ
def __bar(self):
print("called bar")
def main():
hoge = Hoge()
hoge.__bar()
これはダメ
Traceback (most recent call last):
File "/Users/yama/Workspace/python/main.py", line 12, in <module>
main()
File "/Users/yama/Workspace/python/main.py", line 8, in main
hoge.__bar()
^^^^^^^^^^
AttributeError: 'Hoge' object has no attribute '__bar'
アンダースコア2つの場合、マングリング機構なるものによってメソッド名がクラス名で修飾されているらしい
class Hoge:
def __bar(self):
print("called bar")
def main():
hoge = Hoge()
hoge._Hoge__bar() # ←ここ変えた
called bar
反省
ただの命名規則だと思っていたので無駄に時間を使ってしまった
「AttributeError? いや、定義してんじゃん」とキレていたが、悪いのは自分でした。
参考記事