복붙노트

[PYTHON] 이중 밑줄이있는 Python 메서드 이름이 재정의됩니까?

PYTHON

이중 밑줄이있는 Python 메서드 이름이 재정의됩니까?

이것 좀보세요. 클래스 B는 A의 a () 메소드를 오버라이드합니다.

In [1]: class A(object):
   ...:     def __init__(self):
   ...:         self.a()
   ...:     def a(self):
   ...:         print "A.a()"
   ...:         
   ...:         

In [2]: class B(A):
   ...:     def __init__(self):
   ...:         super(B, self).__init__()
   ...:     def a(self):
   ...:         print "B.a()"
   ...:         
   ...:         

In [3]: b = B()
B.a()

거기에 놀라움이 없습니다.

자, 이것 좀보세요. 재정의되는 메소드는 __a ()입니다.

In [7]: class A(object):
   ...:     def __init__(self):
   ...:         self.__a()
   ...:     def __a(self):
   ...:         print "A.__a()"
   ...:         
   ...:         

In [8]: class B(A):
   ...:     def __init__(self):
   ...:         super(B, self).__init__()
   ...:     def __a(self):
   ...:         print "B.__a()"
   ...:         
   ...:         

In [9]: b = B()
A.__a()

이 행동은 나를 놀라게했다.

누구든지 왜 .__ a () 대신 B .__ a ()가 호출되는지 설명 할 수 있습니까?

__a에 대한 __special__은 무엇입니까?

최신 정보: Sean의 대답을 읽은 후에 나는 맹 글링 된 이름의 메서드를 재정의 할 수 있는지보고 싶었고 다음 결과를 얻었습니다.

In [11]: class B(A):
   ....:     def __init__(self):
   ....:         super(B, self).__init__()
   ....:     def _A__a(self):
   ....:         print "B._A__a()"
   ....:         
   ....:         

In [12]: b = B()
B._A__a()

해결법

  1. ==============================

    1.패턴이 __ * 인 키워드는 클래스 개인 이름입니다.

    패턴이 __ * 인 키워드는 클래스 개인 이름입니다.

    http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers

    인용 :

    개인 이름 맹 글링 (중점 추가) :

    http://docs.python.org/reference/expressions.html#atom-identifiers

    이것은 장면 뒤에서 B .__ a ()가 B._B__a ()와 같은 것으로 변형되었음을 의미합니다.

  2. ==============================

    2.

    In [1]: class A(object):
    ...:     def __init__(self):
    ...:         self.a()
    ...:     def a(self):
    ...:         print "A.a()"
    ...:
    ...:     __str__ = a
    ...:         
    
    In [2]: class B(A):
    ...:     def __init__(self):
    ...:         super(B, self).__init__()
    ...:     def a(self):
    ...:         print "B.a()"
    ...:         
    ...:         
    
    In [3]: b = B()
            print str(b)
       A.a()
    

    B에서 __str__을 다시 선언해야합니다.

  3. from https://stackoverflow.com/questions/6444576/python-method-name-with-double-underscore-is-overridden by cc-by-sa and MIT license