[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.패턴이 __ * 인 키워드는 클래스 개인 이름입니다.
패턴이 __ * 인 키워드는 클래스 개인 이름입니다.
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.
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__을 다시 선언해야합니다.
from https://stackoverflow.com/questions/6444576/python-method-name-with-double-underscore-is-overridden by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 키 누르기를 감지합니까? (0) | 2018.10.14 |
---|---|
[PYTHON] 이미지에서 녹색 색상 객체 만 감지하는 임계 값을 정의하는 방법 : Opencv [duplicate] (0) | 2018.10.14 |
[PYTHON] 파이썬에서 문자열에서 날짜 추출하기 (0) | 2018.10.14 |
[PYTHON] 파이썬 : NameError : 전역 이름 'foobar'가 정의되지 않았습니다. (0) | 2018.10.14 |
[PYTHON] 파이썬 3.3의 해시 함수는 세션간에 다른 결과를 반환합니다. (0) | 2018.10.14 |