Python 밑줄 5 가지 의미 코드 인 스 턴 스 분석
단전 도 밑줄 긋 기:var
변수 와 방법 이름 이 언급 되 었 을 때 하나의 밑줄 접 두 사 는 약 속 된 의 미 를 가진다.이것 은 프로그래머 에 대한 힌트 입 니 다.Python 커 뮤 니 티 는 그것 이 무슨 뜻 이 어야 한다 고 일치 하지만 프로그램의 행 위 는 영향 을 받 지 않 습 니 다.
밑줄 접 두 사 는 다른 프로그래머 에 게 알려 주 는 것 입 니 다.하나의 밑줄 로 시작 하 는 변수 나 방법 은 내부 에서 만 사용 할 수 있 습 니 다.이 약속 은 PEP 8 에서 정 의 됩 니 다.
이것 은 Python 이 강제 적 으로 규정 한 것 이 아니다.Python 은 자바 처럼'사유'와'공공'변수 사이 에 강 한 차이 가 있 지 않다.이것 은 누군가가 작은 밑줄 경고 표 지 를 제시 한 것 과 같다.
"이봐,이 건 정말 공공 인터페이스의 일부분 이 되 려 는 게 아니 야."신경 쓰 지 않 으 면 된다"고 말 했다.
단일 끝 밑줄 var
어떤 때 는 변수의 가장 적합 한 이름 이 키워드 에 의 해 점용 되 었 다.따라서 클 라 스 나 def 와 같은 이름 은 Python 의 변수 이름 으로 사용 할 수 없습니다.이 경우 이름 충돌 을 해결 하기 위해 밑줄 을 추가 할 수 있 습 니 다.
>>> def make_object(name, class):
SyntaxError: "invalid syntax"
>>> def make_object(name, class_):
... pass
한 마디 로 하면 하나의 끝 밑줄(접미사)은 Python 키워드 와 이름 충돌 을 피 하 는 약속 입 니 다.PEP 8 은 이 약속 을 설명 했다.쌍 전도 밑줄 긋 기var
지금까지 우리 가 언급 한 모든 명명 모델 의 의 미 는 이미 합 의 된 약속 에서 비롯 되 었 다.두 밑줄 로 시작 하 는 Python 류 의 속성(변수 와 방법 포함)에 대해 서 는 상황 이 조금 다르다.
두 밑줄 접 두 사 는 하위 클래스 의 이름 충돌 을 피하 기 위해 Python 해석 기 가 속성 이름 을 다시 쓸 수 있 습 니 다.
이것 은 이름 수식(name mangling)이 라 고도 합 니 다.-해석 기 는 변 수의 이름 을 바 꾸 어 클래스 가 확 장 될 때 충돌 하지 않도록 합 니 다.
추상 적 으로 들 리 는 거 알 아 요.그래서 나 는 작은 코드 예 시 를 조합 하여 설명 했다.
class Test:
def __init__(self):
self.foo = 11
self._bar = 23
self.__baz = 23
내 장 된 dir()함수 로 이 대상 의 속성 을 봅 시다.
>>> t = Test()
>>> dir(t)
['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_bar', 'foo']
이상 은 이 대상 속성의 목록 입 니 다.이 목록 을 살 펴 보고 우리 의 원시 변수 이름 foo 를 찾 습 니 다.bar 와baz-재 미 있 는 변화 에 주의 하 실 거 라 고 약속 합 니 다.__baz 무슨 일이 야?
자세히 살 펴 보면 이 대상 에 라 는 이름 이 있 습 니 다.Test__baz 의 속성.이것 이 바로 Python 해석 기 가 만 든 이름 수식 입 니 다.이것 은 변수 가 하위 클래스 에서 다시 쓰 이 는 것 을 방지 하기 위해 서 입 니 다.
다른 확장 Test 클래스 를 만 들 고 구조 함수 에 추 가 된 기 존 속성 을 다시 쓰 려 고 합 니 다.
class ExtendedTest(Test):
def __init__(self):
super().__init__()
self.foo = 'overridden'
self._bar = 'overridden'
self.__baz = 'overridden'
지금,당신 은 foo,bar 와baz 의 값 은 이 Extended Test 류 의 인 스 턴 스 에 나타 날 수 있 습 니까?어디 보 자.
>>> t2 = ExtendedTest()
>>> t2.foo
'overridden'
>>> t2._bar
'overridden'
>>> t2.__baz
AttributeError: "'ExtendedTest' object has no attribute '__baz'"
잠시 만 요.t2 를 확인 해 보 겠 습 니 다.baz 의 값 을 얻 을 때,왜 우 리 는 AttributeError 를 얻 습 니까?명칭 수식 이 다시 촉발 되 었 습 니 다!사실 이 증명 하 듯 이 이 대상 은 심지어baz 속성:
>>> dir(t2)
['_ExtendedTest__baz', '_Test__baz', '__class__', '__delattr__',
'__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', '_bar', 'foo', 'get_vars']
보시 다시 피baz 변ExtendedTest__baz 의외 의 수정 방지:>>> t2._ExtendedTest__baz
'overridden'
하지만 원래 의Test__baz 아직:
>>> t2._Test__baz
42
더 블 밑줄 이름 의 수식 은 프로그래머 에 게 완전히 투명 하 다.아래 의 예 는 이 점 을 실증 하 였 다.
class ManglingTest:
def __init__(self):
self.__mangled = 'hello'
def get_mangled(self):
return self.__mangled
>>> ManglingTest().get_mangled()
'hello'
>>> ManglingTest().__mangled
AttributeError: "'ManglingTest' object has no attribute '__mangled'"
명칭 수식 도 방법 명칭 에 적 용 됩 니까?네,적 용 됩 니 다.이름 수식 은 두 개의 밑줄 문자("Dunders")로 시작 하 는 모든 이름 에 영향 을 줄 수 있 습 니 다.
class MangledMethod:
def __method(self):
return 42
def call_it(self):
return self.__method()
>>> MangledMethod().__method()
AttributeError: "'MangledMethod' object has no attribute '__method'"
>>> MangledMethod().call_it()
42
이것 은 또 다른 놀 랄 만 한 명칭 수식 을 활용 한 예 이다.
_MangledGlobal__mangled = 23
class MangledGlobal:
def test(self):
return __mangled
>>> MangledGlobal().test()
23
이 예 에서 나 는 이름 을 이 라 고 밝 혔 다.MangledGlobal__mangled 의 전역 변수 입 니 다.그리고 나 서 나 는 Mangled Global 이라는 상하 문 에서 변 수 를 방문 했다.이름 수식 으로 인해 저 는 클래스 의 test()방법 에서mangled 참조MangledGlobal__mangled 전역 변수.Python 해석 기 자동 으로 이름mangled 확장MangledGlobal__두 개의 밑줄 문자 로 시작 하기 때문에 mangled.이것 은 명칭 수식 이 클래스 속성 과 전문 적 으로 관련 된 것 이 아니 라 는 것 을 나타 낸다.이것 은 클래스 상하 문 에서 사용 하 는 두 개의 밑줄 문자 로 시작 하 는 모든 이름 에 적 용 됩 니 다.
흡수 할 게 많 죠?
솔직히 이런 예 와 해석 은 내 머 릿 속 에서 튀 어 나 온 것 이 아니다.나 는 약간의 연구 와 가공 을 해서 야 구 해 냈 다.나 는 파 이 썬 을 사용 한 지 여러 해 가 되 었 지만 이런 규칙 과 특수 한 상황 이 항상 머 릿 속 에 떠 오 르 지 는 않 는 다.
가끔 프로그래머 의 가장 중요 한 기능 은'패턴 인식'이 고 어디서 정 보 를 찾 는 지 알 고 있다.이 점 에서 좀 당 황 스 럽 다 면 걱정 하지 마 세 요.천천히 하 세 요.이 문장의 예 들 을 시험 해 보 세 요.
이러한 개념 을 완전히 몰입 시 켜 서 당신 이 명칭 수식 의 전체적인 사고 와 내 가 당신 에 게 보 여 준 다른 행 위 를 이해 할 수 있 도록 합 니 다.만약 어느 날 당신 이 그것들 과 우연히 만난다 면,당신 은 문서 에서 무엇 을 찾 는 지 알 게 될 것 입 니 다.
쌍 전도 와 쌍 끝 밑줄 긋 기var_
놀 라 운 것 은 한 이름 이 두 밑줄 로 시작 하고 끝나 면 이름 수식 을 적용 하지 않 는 다 는 점 일 것 이다.두 밑줄 접두사 와 접두사 로 둘러싸 인 변 수 는 Python 해석 기 에서 수정 되 지 않 습 니 다.
class PrefixPostfixTest:
def __init__(self):
self.__bam__ = 42
>>> PrefixPostfixTest().__bam__
42
그러나 파 이 썬 은 쌍 전도 와 쌍 끝 밑줄 이 있 는 이름 을 유지 해 특수 용도 로 사용 했다.이런 예 는''가 있다.init__대상 구조 함수 또는call__ --- 그것 은 대상 을 호출 할 수 있 게 한다.이런 Dunder 방법 은 흔히 신기 한 방법 이 라 고 불 린 다.-그러나 Python 커 뮤 니 티 의 많은 사람들(나 자신 포함)은 이런 방법 을 좋아 하지 않 는 다.
앞으로 Python 언어의 변화 와 충돌 하지 않도록 프로그램 에서 두 밑줄("Dunders")로 시작 하고 끝 나 는 이름 을 사용 하 는 것 을 피 하 는 것 이 좋 습 니 다.
단선
습관 에 따 르 면 어떤 변 수 는 임시 적 이거 나 중요 하지 않다 는 것 을 나타 내 는 하나의 독립 밑줄 을 그 는 것 이다.
예 를 들 어 아래 순환 에서 실행 중인 색인 에 접근 할 필요 가 없습니다.""을 사용 할 수 있 습 니 다.이것 은 임시 값 일 뿐 임 을 나타 낸다.
>>> for _ in range(32):
... print('Hello, World.')
분할(unpacking)표현 식 에서 하나의 밑줄 을'관심 없 는'변수 로 사용 하여 특정한 값 을 무시 할 수도 있 습 니 다.마찬가지 로 이 의 미 는'약속 에 따라'일 뿐 Python 해석 기 에서 특별한 행 위 를 하지 않 습 니 다.하나의 밑줄 은 효과 적 인 변수 이름 일 뿐 이 용도 가 있 을 뿐이다.
아래 의 코드 예제 에서 나 는 자동차 원 조 를 단독 변수 로 나 누 었 으 나,나 는 색깔 과 거리 값 에 만 관심 이 있다.그러나 분할 식 이 성공 적 으로 실행 되 기 위해 서 는 원 그룹 에 포 함 된 모든 값 을 변수 에 할당 해 야 합 니 다.이런 상황 에서""자리 표시 자 변수 로 사용 할 수 있 습 니 다:
>>> car = ('red', 'auto', 12, 3812.4)
>>> color, _, _, mileage = car
>>> color
'red'
>>> mileage
3812.4
>>> _
12
임시 변수 외 에""대부분의 Python REPL 의 특수 변수 입 니 다.해석 기 가 평가 한 최근 표현 식 의 결 과 를 표시 합 니 다.이렇게 하면 매우 편리 합 니 다.예 를 들 어 해석 기 세 션 에서 이전에 계 산 된 결 과 를 방문 할 수 있 거나 여러 개의 대상 을 동적 으로 구축 하고 그들 과 상호작용 을 할 수 있 습 니 다.이런 대상 에 게 미리 이름 을 할당 할 필요 가 없습니다.
>>> 20 + 3
23
>>> _
23
>>> print(_)
23
>>> list()
[]
>>> _.append(1)
>>> _.append(2)
>>> _.append(3)
>>> _
[1, 2, 3]
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.