python 안의 단일 밑줄 과 이중 밑줄 의 차 이 를 간단히 말 하 다

Python 을 공부 할 때 많은 사람들 이 왜 방법(method)앞 에 밑줄 을 여러 개 넣 는 지 이해 하지 못 하고 심지어 양쪽 까지 넣 는 지 이해 하지 못 합 니 다.예 를 들 어this__ 이런제 가 위의 글 을 보기 전에 저 는 Python 에서 이러한 밑줄 의 역할 이 Golang 에서 방법/함수 의 대소 문자 와 같 거나 다른 언어 에서 private,Public 의 역할 과 같다 고 생각 했 습 니 다.그러나 자세히 따 져 보면 이것 은 모두 Python 처럼 디자인 한 취지 가 아 닙 니 다.다음은 구체 적 으로 분석 하 겠 습 니 다.
네 가지 이름 이 주로 존재 합 니 다.
1.object\#공용 방법
2. __object__ # 내부 건설 방법,사용 자 는 이렇게 정의 하지 마 세 요.
3. __object\#모든 개인,모든 보호
4. _object\#반보 호
핵심 스타일:밑줄 을 변수 이름 으로 시작 하 는 것 을 피하 십시오.
밑줄 은 해석 기 에 특별한 의 미 를 가지 고 내부 에 식별 자 를 만 드 는 데 사용 되 는 기호 이기 때문에 우 리 는 프로그래머 가 밑줄 을 변수 이름 으로 하 는 시작 을 피 하 는 것 을 권장 합 니 다.일반적으로 변수 명object 는'개인 적'으로 간주 되 며 모듈 이나 클래스 밖에서 사용 할 수 없고'from module import*'로 가 져 올 수 없습니다.변수 가 사유 일 때object 는 변 수 를 나타 내 는 것 이 좋 은 습관 입 니 다.
단일 밑줄+클래스 이름,eg:Class__object 메커니즘 에 접근 할 수 있 습 니 다object__됐어.변수 명 때문에object__Python 에 있어 서 특별한 의 미 를 가지 고 있 으 며,일반적인 변 수 는 이러한 명명 스타일 을 피해 야 합 니 다.
"단일 밑줄 긋 기"가 시 작 된 구성원 변 수 는 보호 변수 라 고 하 는데 클래스 대상 과 하위 대상 만 이 변 수 를 방문 할 수 있다 는 뜻 입 니 다."더 블 밑줄'은 개인 구성원 으로 시작 되 는데 클래스 대상 만 스스로 방문 할 수 있 고 하위 클래스 대상 도 이 데 이 터 를 방문 할 수 없다 는 뜻 이다.(하 시 는 바 와 같이)
단선 으로 시작foo 의 대 표 는 직접 접근 할 수 없 는 클래스 속성 입 니 다.클래스 가 제공 하 는 인 터 페 이 스 를 통 해 접근 해 야 합 니 다."from xxx import*"로 가 져 올 수 없습니다.더 블 밑줄 로 시작 하 는foo 대표 클래스 의 개인 구성원;두 밑줄 로 시작 하고 끝 나 는foo__python 의 특수 한 방법 을 대표 하 는 표지,예 를 들 어init__()대표 류 의 구조 함수.

class Foo():
  def __init__():
    ...

  def public_method():
    print 'This is public method'

  def __fullprivate_method():
    print 'This is fullprivate_method'

  def _halfprivate_method():
    print 'This is halfprivate_method'

  f = Foo()
  f.public_method() # OK
  f.__fullprivate_method() # Error occur
  f._halfprivate_method() # OK
  f._Foo__fullprivate_method() # OK

위의 예 에서 알 수 있 듯 이 f.halfprivate_method()는 직접 접근 할 수 있 습 니 다.확실 합 니 다.그러나 python 의 약속 에 따라 외부 에서 사용 하지 말고 private 로 봐 야 합 니 다.(굳이 사용 하지 않 아 도 어 쩔 수 없습니다)좋 은 프로 그래 밍 습관 은 외부 에서 사용 하지 않 는 것 입 니 다.동시에 Python docs 의 설명 에 따 르 면object 와object 의 역할 영역 은 이 모듈 에 제한 되 어 있 습 니 다.
다음 프로그램의 출력 을 보십시오.

class A(object):
  def __init__(self):
    self.__private()
    self.public()
  def __private(self):
    print 'A.__private()'
  def public(self):
    print 'A.public()'
class B(A):
  def __private(self):
    print 'B.__private()'
  def public(self):
    print 'B.public()'
b = B()
최초 탐색
정 답 은:
A.__private()
B.public()
우 리 는 각각 다음 클래스 A 와 클래스 B 의 속성 이 어떤 것 이 있 는 지 봅 시다.

>>> print '
'.join(dir(A)) _A__private __init__ public >>> print '
'.join(dir(B)) _A__private _B__private __init__ public
왜 류 A 는 라 는 이름 이 있 습 니까?A__private 속성 은 요?그리고private 가 사 라 졌 습 니 다!이것 은 파 이 썬 의 개인 변수 인'교정'에 대해 이야기 해 야 한다.
Python 은 두 개 이상 의 밑줄 문자 로 시작 하고 두 개 이상 의 밑줄 로 끝 나 는 변 수 를 개인 변수 로 생각 하지 않 습 니 다.개인 변 수 는 코드 가 생 성 되 기 전에 긴 형식 으로 변 환 됩 니 다.변환 메커니즘 은 다음 과 같 습 니 다.변수 전단 에 클래스 이름 을 삽입 하고 전단 에 밑줄 문 자 를 추가 합 니 다.이것 이 바로 개인 변수 교정(Private name mangling)입 니 다.클래스 A 의private 식별 자 는 로 변 환 됩 니 다.A__private,이것 이 바로 지난 절 에 나타 난A__private 와프 라이 빗 이 사라 진 이유.
두 가지 다른 이 야 기 를 하 다.
첫째,교정 은 식별 자 를 길 게 만 들 기 때문에 255 가 넘 으 면 Python 이 차단 되 므 로 이 로 인 한 명명 충돌 에 주의해 야 합 니 다.
둘째,클래스 이름 이 모두 아래 에 선 을 그 어 이름 을 지 을 때 Python 은 더 이상 교정 을 하지 않 습 니 다.예:

class ____(object):
  def __init__(self):
    self.__method()
  def __method(self):
    print '____.__method()'

print '
'.join(dir(____)) __class__ __delattr__ __dict__ __doc__ __getattribute__ __hash__ __init__ __method # __module__ __new__ __reduce__ __reduce_ex__ __repr__ __setattr__ __str__ __weakref__ obj = ____() ____.__method() obj.__method() # ____.__method()
이제 고 개 를 돌려 왜"A."를 출력 하 는 지 살 펴 보 자."private()"하 세 요!
바로 잡 은 후에 A 류 의 코드 는 이렇게 되 었 다.

class A(object):
  def __init__(self):
    self._A__private()     #     
    self.public()
  def _A__private(self):      #      
    print 'A.__private()'
  def public(self):
    print 'A.public()'
클래스 B 정의 에 덮어 쓰 지 않 았 기 때 문 입 니 다init__방법,그래서 호출 된 것 은 여전히 A.init__,self.A__private(),자연 출력"A.private()"라 고 말 했다.
아래 의 두 단락 코드 는 설득력 을 증가 시 키 고 이 해 를 증진 시 킬 수 있다.

class C(A):
  def __init__(self): #    __init__ ,    self._A__private
    self.__private()#        _C_private
    self.public()
  def __private(self):
    print 'C.__private()'
  def public(self):
    print 'C.public()'

c = C()
  :
C.__private()
C.public()

class A(object):
  def __init__(self):
    self._A__private()  #            ,     
    self.public()
  def __private(self):
    print 'A.__private()'
  def public(self):
    print 'A.public()'

a = A()
  :
A.__private()
A.public()
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기