python 밑줄의 다양한 응용 장면 총결산

9060 단어 python밑줄
현재 흔히 볼 수 있는 용법은 다섯 가지가 있다.
  • _임시 변수 사용
  • var_명명 충돌 문제 해결
  • _var 변수 보호용
  • __var 개인 변수에 사용
  • __var__마술용 방법
  • 다음은 이 밑줄 응용 장면을 구체적으로 살펴보자.

    하나,_임시 변수에 사용


    단일 밑줄은 일반적으로 임시 변수를 나타내는 데 사용되며 REPL, for 순환과 모듈 패키지 해체 등 장면에서 흔히 볼 수 있다.

    1.1 REPL


    단일 밑줄이 REPL에 연관된 것은 None이 아닌 이전 계산 결과입니다.
    
    >>> 1+1
    2
    >>> _
    2
    >>> a=2+2
    >>> _
    2
    1+1, 결과는 2로 _에게 부여;반면 부치 표현식 a=2+2a는 4이지만 전체 표현식 결과는 None이므로 _와 연관되지 않습니다.이것은 일상적으로 사람들이 사용하는 계산기의 ANS 버튼과 비슷해서 지난번 계산 결과를 직접 저장했다.

    1.2 for 순환 중의_


    for 순환 중_임시 변수로 사용하다.밑줄로 아무런 의미가 없는 변수를 가리킨다.예를 들어 다음 함수에서 함수 실행 횟수에만 관심이 있고 구체적인 순서에 관심이 없는 경우 _매개 변수로 삼다.
    
    nums = 13
    for _ in range(nums):
        fun_oper()

    1.3 메타그룹 패키지의 _


    세 번째 용법은 원조 해체입니다. 값을 부여할 때_생략된 내용을 표시하다.아래의 코드는 베이징시 인구수를 소홀히 하고 이름과 지역 번호만 얻는다.
    
    >>> city,_,code = ('Beijing',21536000,'010')
    >>> print(city,code)
    Beijing 010
    하나 이상의 항목이 필요한 경우 * 시작 매개변수를 사용하여 여러 항목을 무시할 수 있습니다.아래 코드는 면적과 인구수를 무시하고 이름과 지역 번호만 얻는다
    
    city,*_,code = ('Beijing',21536000,16410.54,'010')

    1.4 국제화 함수


    일부 국제화 프로그래밍에서_번역 함수 이름을 나타내는 데 자주 쓰인다.예를 들어 gettext 패키지를 사용할 때:
    
    import gettext
    zh = gettext.tranlation('dict','locale',languages=['zh_CN'])
    zh.install()
    _('hello world')
    설정된 사전 파일에 근거하여 상응하는 한자 "좋은 세상"을 되돌려줍니다.

    1.5 큰 숫자 표시 형식


    _숫자의 분할에도 사용할 수 있는데, 이것은 숫자가 비교적 길 때 자주 쓰인다.
    
    >>> a = 9_999_999_999
    >>> a
    9999999999
    a의 값은 자동으로 밑줄을 무시합니다.이렇게_숫자를 분할하면 비교적 큰 수를 간편하게 읽는 데 유리하다.

    2,var_이름 충돌 문제 해결


    변수 뒤에 밑줄을 긋다.주로 명칭 충돌 문제를 해결하는 데 사용되며, 원 프로그래밍에서 Python이 보존한 키워드를 만났을 때, 변수의 복사본을 임시로 만들어야 할 때 이런 메커니즘을 사용할 수 있다.
    
    def type_obj_class(name,class_):
        pass
    
    def tag(name,*content,class_):
        pass
    상기 코드에 나타난 class는Python의 보존 키워드입니다. 직접 사용하면 오류를 보고하고 밑줄 접두사를 사용하는 방식으로 이 문제를 해결했습니다.

    셋,_변수 보호용 var


    앞에 밑줄을 긋고 뒤에 변수를 붙이면 내부에서만 사용할 수 있는 보호 변수입니다.예를 들어 함수, 방법 또는 속성.
    이런 보호는 강제 규정이 아니라 해석기가 접근 제어를 하지 않는다는 프로그래머의 약속이다.일반적으로 이런 속성들은 디테일을 실현하기 위해 호출자의 관심을 필요로 하지 않고 언제든지 바뀔 수 있다. 우리가 프로그래밍할 때 방문할 수 있지만 방문을 권장하지 않는다.
    이런 속성은 가져올 때만 보호 작용을 발휘할 수 있다.또한 from XXX import * 이런 도입 형식이어야만 보호 역할을 발휘할 수 있다.
    사용from XXX import *은 일종의 와일드카드 가져오기(wildcard import)입니다. 이것은 Python 커뮤니티에서 추천하지 않는 방식입니다. 도대체 어떤 속성, 방법을 가져왔는지 알 수 없기 때문에 당신의 명칭 공간을 혼란시킬 수 있습니다.PEP8에서 권장하는 가져오기 방식은 from XXX import aVar , b_func , c_func 입니다.
    예를 들어 다음 자동차 라이브러리 함수 도구.py에서 정의한'보호 속성': 엔진 모델과 타이어 모델, 이것은 세부 사항을 실현하는 데 속하기 때문에 사용자에게 노출할 필요가 없다.우리가 from tools import * 문장을 호출할 때 실제적으로 모든 것을 가져오지 않았다_시작 속성, 일반 드라이브 방법만 가져왔습니다.
    
    _moto_type = 'L15b2'
    _wheel_type = 'michelin'
    
    def drive():
        _start_engine()
        _drive_wheel()
    
    def _start_engine():
        print('start engine %s'%_moto_type)
        
    def _drive_wheel():
        print('drive wheel %s'%_wheel_type)
    명령 공간 print (vars () 를 보면 드라이브 함수만 가져오고 다른 밑줄로 시작하는'사유 속성'은 가져오지 않습니다.
    
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x005CF868>, '__spec__': None, '__annotations__':{}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '.\\xiahuaxian.py', '__cached__': None, 'walk': <function walk at 0x01DA8C40>, 'root': '.\\__pycache__', '_': [21536000, 16410.54], 'dirs': ['tools.cpython-38.pyc'], 'city': 'Beijing', 'code': '010', 'drive': <function drive at 0x01DBC4A8>}

    3.1 보호 속성 돌파


    '보호'가'사유'가 아니라는 것은 파이썬이 접근 권한을 제어하기 위한 해석기 메커니즘을 제공하지 않았기 때문이다.우리는 여전히 이러한 속성에 접근할 수 있다.
    
    import tools
    tools._moto_type = 'EA211'
    tools.drive()
    위 코드는 "보호 속성"을 넘어갑니다.그 밖에 이 제한을 돌파할 수 있는 두 가지 방법이 있다. 하나는'사유 속성'을 도구에 추가하는 것이다.py 파일의 __all__목록에서 from tools import * 숨겨진 속성도 가져옵니다.
    
    __all__ = ['drive','_moto_type','_wheel_type']
    다른 하나는 가져올 때 보호된 속성 이름을 지정하는 것입니다.
    
    from tools import drive,_start_engine
    _start_engine()
    심지어 사용import tools도 보호 제한을 쉽게 돌파할 수 있다.그러므로'보호 속성'은 간단한 숨김 메커니즘으로 from tools import * 때만 해석기가 간단한 보호를 제공하지만 쉽게 돌파할 수 있다.이러한 보호는 프로그래머의 공통된 인식에 더 많이 의존한다. 접근 없이'보호 속성'을 수정하는 것이다.그 외에 더욱 안전한 보호 메커니즘이 있습니까?네, 바로 다음 부분에서 토론할 사유 변수입니다.

    넷째, __var 개인 변수에 사용


    사유 속성이 해결되기 전의 보호 속성 보호 역량이 부족한 문제.변수 앞에 두 개의 밑줄을 치고 클래스 안에 속성명과 방법으로 사용할 수 있습니다.두 개의 밑줄 속성은 Python의 개작 메커니즘으로 이 속성에 대한 보호를 실현한다.
    다음 자동차 예를 보면 브랜드는 일반적인 속성이고 엔진은'보호 속성', 바퀴 브랜드는'사유 속성'이다.
    
    class Car:
        def __init__(self):
            self.brand = 'Honda'
            self._moto_type = 'L15B2'
            self.__wheel_type = 'michelin'
    
        def drive(self):
            print('Start the engine %s,drive the wheel %s,I get a running %s car'%
            (self._moto_type,
            self.__wheel_type,
            self.brand))
    우리는 var(car1)로 구체적인 속성 값을 보십시오.
    
    ['_Car__wheel_type', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_moto_type', 'brand', 'drive']
    이를 통해 알 수 있듯이 실례화car1에서 일반 속성self.브랜드 및 보호 속성 self._moto_type 모두 저장, 두 밑줄의 개인 속성 __wheel_type이 없습니다.대신 _Car_wheel_type 이 속성입니다.이것이 바로 개작 메커니즘 (Name mangling) 입니다.두 개의 밑줄 속성은 클래스 이름의 접두사가 있는 변수로 바뀌었는데, 이런 클래스는 이렇게 복잡한 이름과 이름을 바꾸는 속성을 분명히 하기 어렵다.속성이 재부팅되지 않고 사유성을 보장합니다.

    4.1 개인 속성 돌파


    여기서'사유 변수'의 실현은 해석기 차원에서 주어진 개작으로 사유 변수를 보호했다.그러나 이 메커니즘은 절대적으로 안전하지 않다. 왜냐하면 우리는 여전히 obj._를 통과할 수 있기 때문이다.ClasssName__private 액세스 __개인 개인 속성.
    
    car1.brand = 'Toyota'
    car1._moto_type = '6AR-FSE'
    car1._Car__wheel_type = 'BRIDGESTONE'
    car1.drive()
    결과
    Start the engine 6AR-FSE,\
    drive the wheel BRIDGESTONE,\
    I get a running Toyota car
    이를 통해 알 수 있듯이 개작 메커니즘의 개작에 대한 개인 변수는 보호성이 강화되었지만 여전히 방문하고 수정할 수 있다.단지 이런 수정은 일종의 잡기 같은 조작일 뿐 결코 취할 수 없다.

    다섯,__var__마술 방법에 사용


    변수 앞에 밑줄 두 개, 뒤에 밑줄 두 개.이것은 Python의 마술 방법으로 일반적으로 시스템 프로그램에 호출된다.예를 들어 위의 __init__클래스의 초기화 마술 방법, 그리고 렌 함수를 지원하는 __len__메서드, 컨텍스트 매니저 프로토콜을 지원하는 __enter__및 __exit__메서드, 교체기 프로토콜을 지원하는 __iter__메서드, 포맷 디스플레이를 지원하는 __repr__및 __str__방법 등등.여기서 우리는 전례의 Car 클래스에 마술 방법을 추가합니다__repr__포맷 디스플레이를 지원합니다.
    
        def __repr__(self):
            return '***Car %s:with %s Engine,%sWheel***'%
            (self.brand,self._moto_type,self.__wheel_type)
    추가되지 않음 __repr__마술 방법 이전, print(car1) 결과는 <__main__.Car object at 0x0047F7F0>, 이 결과는 보는 이로 하여금 안개를 끼치게 하고repr 마술 방법을 추가한 후, 결과는 *** Car Toyota: with 6AR-FSE Engine, BRIDGESTONE Wheel**** 명확하고 디버깅에 이롭다.이것이 바로 마술 방법의 효능이다. 시스템 호출을 지원하고 사용자 클래스의 표현을 개선하며 프로토콜 지원을 증가하고 사용자 클래스를 사용하여 시스템 클래스와 더욱 비슷하게 표현한다.

    5.1 파이썬 마술 방법 분류


    다음 모든 마술 방법은 앞뒤에 __를 붙여야 합니다.여기에는 이중 밑줄이 생략되어 있습니다.
  • 일원 연산자 negpos abs invert
  • complex intfloat round inex
  • 변환
  • 산술 연산addsubmultruedivfloordivmoddivmodpowlshiftrshift andxor
  • 산술 연산은 and를 제외하고 앞에 r를 더하면 반연산을 나타낸다.dimod를 제외하고 앞에 i를 더하면 현지 연산을 나타낸다.
  • ltleeqnegtge
  • 비교
  • 클래스 속성 getattr getattribute setattr delattr dir get set delete
  • byteshashboolformat
  • 포맷
  • 클래스 관련 init del new
  • 목록 getitem
  • 교체기iternext
  • 상하문 관리자enter exit
  • 6. 총결산


    한 마디로 하면 밑줄이 Python에서 광범위하게 응용되고 심지어 Python이 밑줄을 선호한다고 할 수 있다
    보실 수 있습니다_임시 변수에 자주 사용되며 REPL, for 순환, 모듈 해체와 국제화에서 광범위하게 응용되었다
    var_명명 충돌 문제를 해결하는 데 사용됩니다. 비교적 간단하고 이해하기 쉽습니다._var 변수에 대한 보호는 취약한 보호일 뿐, 프로그래머의 약속에 더 의존합니다.__var는 개인 변수에 사용되며, 개작 메커니즘의 지원을 빌려 개인 변수를 지원하지만, 여전히 빈틈이 존재한다
    네__var__마술 방법에 대해 간단하게 소개했는데 마술 방법은 비교적 많지만 이해는 복잡하지 않다.앞으로 이런 마술 방법을 좀 더 소개해 주셨으면 좋겠어요.
    이상은python 밑줄의 다양한 응용 장면 총결에 대한 상세한 내용입니다.python 밑줄 응용 장면에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

    좋은 웹페이지 즐겨찾기