Python 밑줄 5 가지 의미 코드 인 스 턴 스 분석

8721 단어 Python밑줄
다섯 가지 Python 밑줄 모드 속사 표:

단전 도 밑줄 긋 기: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-재 미 있 는 변화 에 주의 하 실 거 라 고 약속 합 니 다.
  • self.foo 변 수 는 속성 목록 에서 foo 로 변경 되 지 않 은 것 으로 표 시 됩 니 다
  • self._bar 의 행동 방식 이 같 습 니 다.-얘 는bar 의 형식 은 클래스 에 표 시 됩 니 다.내 가 전에 말 했 듯 이 이런 상황 에서 선도 하 선 은 약속 일 뿐이다.프로그래머 에 게 힌트 를 주 었 을 뿐 이 야.
  • 그러나 self. 에 대해 서 는baz 의 경우 상황 이 좀 달라 보 입 니 다.이 목록 에서 검색 하면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]
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기