0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonのアンダースコアはただの命名規則じゃなかった

Last updated at Posted at 2023-07-18

無駄に時間使ったので備忘録

メソッド名にアンダースコア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? いや、定義してんじゃん」とキレていたが、悪いのは自分でした。

参考記事

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?