Python 접근 제한 private Public 에 대한 상세 한 소개

지식
한 모듈 에서 우 리 는 많은 함수 와 변 수 를 정의 할 수 있 습 니 다.그러나 어떤 함수 와 변 수 는 우리 가 다른 사람 에 게 사용 할 수 있 기 를 바 랍 니 다.어떤 함수 와 변 수 는 모듈 내부 에서 만 사용 하고 싶 습 니 다.so?
우 리 는 이 함수,변수 가 공개 적 인지 개인 적 인지 정의 함으로써 이 목적 을 달성 할 수 있다.
Python 에 서 는 밑줄 을 통 해""입 니 다.접두사 로 이 루어 졌 습 니 다.
  • Public:공개 적 입 니 다.정상 적 인 함수 와 변수 이름 은 이 형식 으로 직접 참조 할 수 있 습 니 다.예 를 들 어 변수 abc,PI 등;
  • 특수 변수:형식 은xxx__ ,이처음결말직접 인용 할 수 있 지만 특별한 용도 가 있 습 니 다.예 를 들 면author__ 、__name__특수 변수 입 니 다.일반적으로 자신 이 정의 하 는 변 수 는 이런 변 수 를 사용 하지 마 세 요.4567918)
  • private:사유 적,비공개 적,형식 유사xxx_ 와xxx,예 를 들 어num。
  • 직접 인용 되 어 서 는 안 되 며 내부 만 접근 할 수 있 고 외부 에 서 는 접근 할 수 없습니다.
    대상 내부 의 상 태 를 임의로 수정 할 수 없습니다.이렇게 하면 방문 제한 보 호 를 통 해 코드 가 더욱 건장 합 니 다.
    2.예 를 들 어 설명 한다.
    Class 클래스 내부 에서 속성 과 방법 이 있 을 수 있 습 니 다.외부 코드 는 인 스 턴 스 변 수 를 직접 호출 하 는 방법 으로 데 이 터 를 조작 하여 내부 복잡 한 논 리 를 숨 길 수 있다.그러나 외부 코드 는 인 스 턴 스 의 속성 을 자 유 롭 게 수정 할 수 있다.예 를 들 면:
    
    >>>b.score
    99
    >>>b.score = 59
    >>>b.score
    59
    
    내부 속성 이 외부 에 접근 하지 않도록 하려 면 속성의 이름 앞 에 밑줄''두 개 를 추가 할 수 있 습 니 다.개인 변수 로 변 경 됩 니 다.다음 과 같 습 니 다.
    
    class Student(object):   
      def __init__(self, name, score):     
        self.__name = name     
        self.__score = score   
        
      def print_score(self):     
        print('%s: %s' % (self.__name, self.__score))
    
    외부 에서 속성 에 접근 하려 고 시도 하 는데 오류 가 발생 할 수 있 습 니 다.개인 변수 때문에 외부 에 접근 할 수 없습니다.
    
    >>> bart = Student('Bart Simpson', 98) 
    >>> bart.__name #     :       
    Traceback (most recent call last):  
    File "<stdin>", line 1, in <module> 
    AttributeError: 'Student' object has no attribute '__name'
    그러나 외부 코드 가 name 과 score 를 가 져 오 려 면 어떻게 합 니까?
    Student 클래스 에 속성 을 추가 하 는 방법:getname()과 getscore(),다음 과 같 습 니 다.
    
    class Student(object):
      ...
      def get_name(self):     
        return self.__name   
      def get_score(self):     
        return self.__score 
    
    외부 코드 가 score 를 수정 하면 어떻게 합 니까?Student 클래스 에 추가 설정 방법:setscore():
    
    ...
    def set_score(self, score): 
      #          
      if 0 <= score <= 100: 
        self.__score = score 
      else:       
        raise ValueError('bad score') 
    그럼 더 블 밑줄 로 시작 하 는 개인 인 스 턴 스 변 수 는 반드시 외부 에서 접근 할 수 없 는 것 이 아 닙 니까?사실 아니 야.
    직접 방문 불가name 은 Python 해석 기 가 대외 적 으로name 변수 가 로 변경 되 었 습 니 다.Student__name,그래서 여전히Student__name 접근name 변수.
    
    >>> bart = Student('Bart Simpson', 98)
    >>> bart.get_name() 
    'Bart Simpson' 
    >>> bart.__name = 'New Name' #  bart   __name   
    >>> bart.__name        # ! class   __name        !
    'New Name' 
    >>> bart.get_name()      # get_name()    self.__name (_Student__name)
    'Bart Simpson'  
    
    겉 으로 는 외부 코드 가 를 성공 적 으로 설정 하 였 습 니 다.name 변수,하지만 실제로 이name 변수 와 class 내부 의name 변 수 는 변수 가 아 닙 니 다!내부 의name 변 수 는 Python 해석 기 에 의 해 자동 으로 변경 되 었 습 니 다Student__name,외부 코드 가 bart 에 를 추가 하 였 습 니 다.name 변수.
    따라서 python 은 private 에 접근 하 는 함수 나 변 수 를 완전히 제한 할 수 있 는 방법 이 없 기 때문에'직접 인용 할 수 없습니다'가 아니 라 프로 그래 밍 습관 적 으로 private 함수 나 변 수 를 인용 해 서 는 안 됩 니 다.그럼 그들의 용 도 는?
    예 를 들 면:
    
    def _private_1 (name):
      return 'hello,%s ' % name
    def _private_2 (name):
      return 'hi , %s ' % name
    def greeting(name):
      if len(name) > 3:
        return _private_1 (name)
      else:
        return _private_2 (name)
    모듈 에 greeting()함 수 를 공개 하고 내부 논 리 를 private 함수 로 숨 겼 습 니 다.이렇게 해서 greeting()함 수 를 호출 하면 내부 의 개인 함수 의 세부 사항 에 관심 을 가지 지 않 아 도 됩 니 다.
    이것 은 매우 유용 한 코드 패키지 와 추상 적 인 방법 이다.즉,외부 에서 인용 할 필요 가 없 는 함 수 는 모두 private 로 정의 되 고 외부 에서 인용 해 야 할 함수 만 Public 로 정의 된다.
    3.전체 코드
    
    class Student(object):   
      def __init__(self, name, score):     
        self.__name = name     
        self.__score = score   
        
      def print_score(self):     
        print('%s: %s' % (self.__name, self.__score))
      
      def get_name(self):     
        return self.__name   
      
      def get_score(self):     
        return self.__score
        
      def set_score(self, score): 
        #          
        if 0 <= score <= 100: 
          self.__score = score 
        else:       
          raise ValueError('bad score')  
          
      def _private_1 (name):
        return 'hello,%s ' % name
      def _private_2 (name):
        return 'hi , %s ' % name
      def greeting(name):
        if len(name) > 3:
          return _private_1 (name)
        else:
          return _private_2 (name)
    
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기