Python 에서 이중 밑줄 을 사용 하여 클래스 속성 이 덮어 쓰 이 는 것 을 방지 합 니 다.

Python 을 사용 하여 대상 을 대상 으로 하 는 코드 를 작성 할 때,우 리 는 자주'계승'이라는 개발 방식 을 사용 합 니 다.예 를 들 어 다음 코드:

class Info:
  def __init__(self):
    pass
  def calc_age(self):
    print('       ')
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
  def calc_age(self):
    print(123456)
PeopleInfo 를 사용 하여 대상 을 초기 화하 고 이 종류의 calc 를 호출 합 니 다.age 방법,다음 그림 과 같이 운행 효 과 를 봅 시다.
 
알 수 있 듯 이,부류 Info 의 calcage 이불 속 calcage 가 덮어 씌 웠 습 니 다.
지금까지는 네가 이미 알 고 있 었 을 거 야.그럼 다음 질문 은 PeopleInfo 에 있 는init__ Info 의 를 덮어 쓰 지 않 을 까init__ ?
이 점 을 확인 하기 위해 테스트 해 보 자.

class Info:
  def __init__(self):
    print('     __init__')
  def calc_age(self):
    print('       ')
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
    print('          ')
  def calc_age(self):
    print(123456)
다음 그림 과 같이 실행 효과:
 
여기 서 부류 와 자 류 를 발견 한init__ 다 실 행 됐 습 니 다.
그러나 당신 은 하위 클래스 의 로 강제로 해석 할 수 있 습 니 다.init__ 안에 슈퍼()가 한 줄 있 습 니 다.init__() ,이곳 은 하위 클래스 가 부모 클래스 를 완전히 덮 지 않 았 는 지 먼저 부모 클래스 의 방법 을 실행 했다.하위 클래스 의init__ 모든 실행 이 끝 난 후에 야 부 류 를 덮어 씁 니 다.
물론 이런 강제 궤변 은 잘못된 것 이지 만,여기 서 당신 이 본 현상 과 이 슈퍼()를 증명 하기 위해 서 는.init__() 아무 상관 없어,우 리 는 를 사용 하지 않 아.init__ ,스스로 하 나 를 정의 하 는 것 이다.

class Info:
  def __init__(self):
    pass
  def __calc_age(self):
    print('       ')
  def run_father(self):
    self.__calc_age()
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
    pass
  def __calc_age(self):
    print(123456)
  def run_son(self):
    self.__calc_age()
다음 그림 과 같이 실행 효과:
 
여기 서 알 수 있 듯 이 부계 와 자 류 의calc_age 가 성공 적 으로 작 동 했 습 니 다.
Python 에서 클래스 방법 이나 속성 이 두 밑줄 로 시작 하면 클래스 의 개인 적 인 방법 입 니 다.계승 되 었 을 때 하위 클래스 가 같은 이름 의 두 밑줄 로 시작 하 는 속성 이나 방법 이 부모 클래스 를 덮어 쓰 지 않 기 때 문 입 니 다.
그리고 이 두 밑줄 로 시작 하 는 개인 적 인 방법 이나 속성 은 클래스 내부 에서 다른 방법 으로 자 유 롭 게 호출 될 수 있 지만 인 스 턴 스 대상 에서 직접 호출 할 수 없습니다.다음 그림 과 같 습 니 다.
 
그렇다면 파 이 썬 은 어떻게 이 점 을 이 루 었 을 까?사실 파 이 썬 은 이름 만 바 꿨 을 뿐이다.다음 그림 과 같이 dir 함 수 를 사용 하여 실례 대상 킹 name 에 어떤 내용 이 있 는 지 봅 시다.
 
여러분,네모 난 틀 에 박 힌 내용,그 중의 에 주의 하 세 요.Info__calc_age 는 부류 의calc_age,그리고PeopleInfo__calc_age 는 하위 클래스 의calc_age 。Python 은 단지 이름 을 바 꾸 었 을 뿐 입 니 다.이 두 밑줄 친 개인 적 인 방법 이나 개인 적 인 속성 앞 에 을 붙 였 습 니 다.유형 명,이렇게 하면 자 류 와 부 류 의 방법 명 이 일치 하지 않 음 을 확보 할 수 있다.
따라서 규범 상 으로 는 이러한 더 블 밑줄 친 개인 적 인 방법 과 개인 적 인 속성 은 외부 에서 방문 해 서 는 안 되 지만 강제로 방문 하고 싶다 면 이름 을 바 꾼 후의 이름 을 사용 할 수 있 습 니 다.

kingname = PeopleInfo()
kingname._PeopleInfo__calc_age() #            
kingname._Info__calc_age() #            
다음 그림 과 같이 실행 효과:
 
총결산
위 에서 말 한 것 은 소 편 이 소개 한 Python 에서 이중 밑줄 을 사용 하여 클래스 속성 이 덮어 쓰 이 는 문 제 를 방지 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기