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 에서 이중 밑줄 을 사용 하여 클래스 속성 이 덮어 쓰 이 는 문 제 를 방지 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.