Pythonアクセス制限prvate publicの詳細紹介


一、知識点
一つのモジュールでは、多くの関数と変数を定義することができます。しかし、ある関数と変数は他の人に使わせたいです。ある関数と変数はモジュールの中だけで使いたいです。
この関数、変数は公開されているか、それともプライベートなかを定義することによって目的を達成することができます。
Pythonでは、下線を通る「_」です。プレフィックスで実装されます。
  • pblic:公開されています。通常の関数と変数名はこのタイプのため、直接参照されます。たとえば変数abc、PIなどです。
  • 特殊変数:フォーマットは__u uxxx_,ひを吐く頭を括る締めくくりをつける直接引用できますが、特殊な用途があります。たとえば_うauthor_、_name_は、特殊変数です。一般的に自分で定義した変数はこの変数名を使わないでください。
  • prvate:プライベート、非公開、フォーマットは_に類似しています。xxx同前xxx、例えばnum
  • 直接引用されるべきではなく、内部のみアクセスでき、外部はアクセスできません。
    オブジェクト内部の状態を勝手に変更することはできません。このようにアクセス制限の保護によってコードがより強固になります。
    二、例を挙げて説明する
    クラスの中には、属性と方法があります。外部コードは、インスタンス変数を直接呼び出す方法によってデータを操作し、内部の複雑な論理を隠すことができる。しかし、外部コードは、インスタンスの属性を自由に変更することができる。たとえば:
    
    >>>b.score
    99
    >>>b.score = 59
    >>>b.score
    59
    
    内部属性を外部にアクセスさせない場合は、属性の名称の前に下線を2つ付けます。プライベート変数になります。
    
    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クラスに属性を追加する方法:get_name()とget_スコアは以下の通りです
    
    class Student(object):
      ...
      def get_name(self):     
        return self.__name   
      def get_score(self):     
        return self.__score 
    
    外部コードがscoreを修正したらどうなりますか?Studentクラスの追加設定方法:set_スコア():
    
    ...
    def set_score(self, score): 
      #          
      if 0 <= score <= 100: 
        self.__score = score 
      else:       
        raise ValueError('bad score') 
    二重アンダーラインの先頭にある私有インスタンス変数は外部からアクセスできないということですか?実はそうでもないです。
    直接訪問できませんnameはPython解凍器のために外に出します。name変数が_に変更されましたStudent_u.name、だからまだ通過できます。Student_u.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変数とクラス内部の_u uname変数は変数ではありません。内部の_uname変数はPython解釈器によって自動的に変更されました。Student_u.nameは、外部コードをbartに追加しました。name変数。
    したがって、pythonはprvateにアクセスする関数や変数を完全に制限する方法がないので、「直接引用されてはいけない」というわけではなく、プログラミングの習慣からprvate関数や変数を引用するべきではない。彼らの使い道は?
    たとえば:
    
    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関数を公開し、内部論理をprvate関数で隠しました。このようにして,greeting()関数を呼び出して,内部のプライベート関数の詳細に関心を持たなくてもよい。
    これは非常に有用なコードパッケージと抽象的な方法であり、外部から引用する必要がない関数をすべてprvateと定義し、外部から引用する必要がある関数だけがpublicと定義される。
    三、完全コード
    
    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)
    
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。