Python のアクセス制限がプライベートかパブリックかについての概要 (例付き)

不言
リリース: 2018-10-16 15:52:09
転載
1935 人が閲覧しました

この記事では、Python のアクセス制限がプライベートかパブリックかについて紹介します (例付き)。一定の参考値があります。困っている友人は参考にしてください。お役に立てれば幸いです。

1. 知識ポイント

モジュールでは、多くの関数と変数を定義することがあります。しかし、一部の関数と変数は他の人が使用できるようにする必要があり、また一部の関数と変数はモジュール内でのみ使用できるようにする必要があるので、?
関数と変数がパブリックかプライベートかを定義することで、この目標を達成できます。
Python では、これはアンダースコア「_」プレフィックスによって実現されます。

パブリック: パブリック。通常の関数名や変数名はこのタイプであり、直接参照できます。たとえば、変数 abc、PI など;

特殊変数: 形式は __xxx__ で、__ で始まり __ で終わります。直接参照できますが、特殊な用途があります。たとえば、__author__ と __name__ は特殊変数です。一般に、自分で定義する変数にはこのタイプの変数名を使用しないでください。

private: プライベート、非公開、__xxx_ および __xxx に似た形式 (__num など)。
は直接参照しないでください。内部からのみアクセス可能であり、外部からはアクセスできません。
オブジェクトの内部状態は自由に変更できないため、アクセス制限の保護によりコードはより堅牢になります。

2. 例

Class クラス内には属性とメソッドを含めることができます。外部コードは、インスタンス変数メソッドを直接呼び出して、内部の複雑なロジックを隠すことによってデータを操作できます。ただし、外部コードは依然としてインスタンスのプロパティを自由に変更できます。例:

>>>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))
ログイン後にコピー
Try to 外部からプロパティにアクセスすると、プライベート変数には外部からアクセスできないため、エラーが報告されます。

>>> 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'
ログイン後にコピー
しかし、外部コードが名前とスコアを取得したい場合はどうなるでしょうか?

属性を取得するメソッドを Student クラスに追加します: get_name() および get_score() (次のように):

class Student(object):
    ...
    def get_name(self):          
        return self.__name      
    def get_score(self):          
        return self.__score
ログイン後にコピー
外部コードがスコアを変更した場合はどうなりますか? Student クラスに設定メソッドを追加できます:

set_score():

...
def set_score(self, score):  
    # 避免传入无效参数  
    if 0 <= score <= 100:  
        self.__score = score 
    else:              
        raise ValueError(&#39;bad score&#39;)
ログイン後にコピー

では、二重アンダースコアで始まるプライベート インスタンス変数は外部からアクセスできないようにする必要がありますか?あまり。

Python インタープリターは外部で __name 変数を _Student__name に変更するため、__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 変数とクラス内の __name 変数は同じ変数ではありません。内部 __name 変数は Python インタープリターによって自動的に _Student__name に変更され、外部コードによって新しい __name 変数が bart に追加されます。

つまり、Python にはプライベート関数や変数へのアクセスを完全に制限する方法がないため、「直接参照できない」わけではありません。プログラミングの習慣から、プライベート関数や変数は参照すべきではありません。それらは何の役に立つのでしょうか?

例:

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() 関数はモジュール内で公開されますが、内部ロジックはプライベート関数を使用して隠蔽されます。このようにして、greeting() 関数を呼び出す際に、内部プライベート関数の詳細を気にする必要がなくなります。

これは、コードのカプセル化と抽象化の非常に便利な方法です。つまり、外部から参照する必要のないすべての関数はプライベートとして定義され、外部から参照する必要がある関数のみがパブリックとして定義されます。 。

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(&#39;bad score&#39;)   
            
    def _private_1 (name):
        return &#39;hello,%s &#39; % name
    def _private_2 (name):
        return &#39;hi , %s &#39; % name
    def greeting(name):
        if len(name) > 3:
            return _private_1 (name)
        else:
            return _private_2 (name)
ログイン後にコピー

以上がPython のアクセス制限がプライベートかパブリックかについての概要 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート