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()
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.