关于python的继承的一个疑问
迷茫
迷茫 2017-04-18 10:28:50
0
3
890

如图所示,B 类继承了 A 类;

当实例化对象时,B 类中没有构造函数, 应该调用父类的构造函数 __init__

但是里边的 self.__pirv() 为啥调用到父类 A__priv, 而 self.pub() 又调到 B 中的 pub

求解?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

모든 응답(3)
左手右手慢动作

Python에서 __로 시작하는 메서드 이름은 비공개가 아닙니다. __는 Python에서 이름 변경을 수행하도록 한다는 의미입니다. 이름 변경의 결과는 _A__priv입니다. 이 방법을 사용하여 덮어쓰면 안 됩니다. 서브클래스가 메소드를 덮어쓰도록 하려면 __이 아닌 _만 사용할 수 있습니다.

大家讲道理

이 질문에 대해 잠시 생각해 본 결과, 제가 이해한 바는 다음과 같습니다.

으아악

하위 클래스의 인스턴스가 __init__() 메서드를 호출하면 B 메서드는 하위 클래스 pub() 자체에서 발견되므로 B 클래스 자체의 pub() 메서드는 다음과 같습니다. 그러나 __priv() 메서드를 호출할 때 Python의 개인 멤버의 이름 적응 으로 인해 실제로 _A__priv() 메서드를 호출하고 B 클래스에는 해당 메서드가 없습니다. , 일부는 _B__priv() 만 있으므로 상위 클래스 A_A__priv() 가 호출되어 이러한 결과가 발생합니다. 이건 제 개인적인 이해이므로 틀린 부분이 있으면 정정해 주시기 바랍니다. 감사합니다.

巴扎黑

문제 자체에 대해서는 @Xavier와 @Christoph가 이미 자세히 설명했습니다


아직 이해가 되지 않는다면 다음을 시도해 보세요.

원본 코드:

으아악

수동으로 이름 짓기:

으아악

B 여기서는 다음을 포함하여 A의 모든 속성을 상속합니다.

  • __init__

  • _A__priv

  • public

B은 자신을 정의합니다.

  • _B__priv

  • public (여기서 Apublic을 덮어씁니다)

마지막으로 다음 내용이 포함된 dir(b)이 표시됩니다.

  • __init__(A에서 상속됨)

  • _A__priv(A에서 상속됨)

  • _B__priv(직접 정의)

  • public(직접 정의)

마지막으로 __init__이 호출되면 _A__priv이 호출되는데 B에는

내부에 이 메소드가 있습니다.

Python 자체에는 실제 비공개 메커니즘이 없다는 점을 덧붙이고 싶습니다. 이름 변경을 이해하는 사람은 이중 밑줄로 시작하는 속성에 액세스할 수 있기 때문입니다. 예를 들어 다음과 같이 쉽게 작성할 수 있습니다. 으아악

간단히 말하면 이 메커니즘은 다음과 같습니다.

  • 바보 방지 메커니즘은 악당 방지 메커니즘이 아닙니다.

  • 우발적인 액세스를 방지하는 메커니즘, 고의적인 액세스

    를 방지하는 메커니즘이 아님
그러나 모든 사람이 이 메커니즘을 좋다고 생각하는 것은 아닙니다(개인적으로는 마음에 들지 않습니다. 이름을 시작하기 위해 이중 밑줄을 사용하는 것은 번거롭고 별로 도움이 되지 않습니다). 따라서 많은 Python 코드에서 이 메커니즘을 찾을 수 있습니다. 처음에는

단일 결론 보호 방법을 사용합니다. 이 접근 방식은 널리 알려진 관행입니다(참고 1). 경험이 적은 프로그래머도 바보를 방지하는 데 충분하며 추가 효과나 예상치 못한 상황이 발생하지 않습니다.

Ian Bicking에는 다음과 같은 구절이 있습니다(Ian Bicking은 Python 마스터입니다. Luciano Ramalho의 Fluent Python에서 이 구절을 봤습니다).

그래서 제 제안은

을 사용하는 것이 더 나은 선택이 될 것입니다.

_priv참고 1: 단일 밑줄로 시작하는 속성에는 특별한 속성이 없습니다. 이는 일부 언어에서

를 사용하여 상수를 표시하는 것처럼 Python 프로그래머의 합의에 의존하는 상징적 방법일 뿐입니다. , 그리고 예상치 못한 상황을 피하기 위해
대문자 명명

을 사용하는 상수의 합의에 의존할 수도 있습니다const 참고 2: 개인 속성으로 속성을 보호하려는 이유는 가장 일반적인 이유는 이름 충돌로 인한 우발적인 액세스이기 때문입니다


내가 답변한 질문: Python-QA

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿