プライベート変数

前提条件:Pythonのアンダースコア Pythonでは、オブジェクトの内部以外ではアクセスできないPrivateインスタンス変数は存在しません。しかしながら、大部分のPythonコードおよびコーダ、すなわちアンダースコアを前に付けた名前が慣例に従っています。 codeは、関数、メソッド、データメンバのいずれであっても、APIまたはPythonコードの非公開部分として扱う必要があります。これを見ながら、さまざまな形式の末尾のアンダースコアの概念を理解しようとします。たとえば、 in(10)、__ init __(self)などです。 マングリングとその仕組み Pythonでは、名前マングリングと呼ばれるものがあります。これは、基本的にサブクラスで定義された名前と名前の名前の衝突を避けるために、クラスプライベートメンバーの有効なユースケースに対するサポートが限られていることを意味します。形式__code(少なくとも2つの先行アンダースコアまたは最大1つの後続アンダースコア)のIDは、_classname__codeに置き換えられます。ここで、classnameは、先行アンダースコアを取り除いた現在のクラス名です。クラスの定義内で発生する限り、このマングルは行われます。これは、クラス内のメソッド呼び出しを中断することなくサブクラスにメソッドをオーバーライドさせるのに役立ちます。 この例を見て、このアンダースコアがどのように機能するのかを調べてみましょう。

🐶Pythonコードの例を示すで

# Python code to illustrate how mangling works
class Map:
    def __init__(self, iterate):
        self.list = []
        self.__code(iterate)
    def code(self, iterate):
        for item in iterate:
            self.list.append(item)

    # private copy of original code() method
    __code = code    

class MapSubclass(Map):

    # provides new signature for code() but
    # does not break __init__()
    def code(self, key, value):         
        for i in zip(keys, values):

🐶動画で動作確認してみよか?

動画で確認

マングリングルールは主に事故を避けるために設計されていますが、それでもプライベートと見なされる変数にアクセスしたり変更したりすることは可能です。これは、デバッガのように特別な状況でも役に立ちます。 _シングルリーディングアンダースコア したがって、基本的にメソッド、関数、またはデータメンバの先頭に1つの下線が引かれているのは、APIの一部ではないため、このメソッドにアクセスしてはいけないことを意味します。このコードの断片を見てみましょう。

🐶Pythonコードの例を示すで

# Python code to illustrate  
# how single underscore works
def _get_errors(self):
    if self._errors is None:
        self.full_clean()
    return self._errors

errors = property(_get_errors)

🐶動画で動作確認してみよか?

動画で確認

スニペットはDjangoのソースコード(django / forms / forms.py)から取得されています。これは、エラーはプロパティであり、APIの一部でもあることを示唆していますが、_get_errorsというメソッドはプライベートなので、アクセスしないでください。 __ダブルリーディングアンダースコア 最初の2つの下線は、多くの混乱を招きます。これは規約ではなく構文についてです。二重下線は、クラス間の属性名の競合を避けるためにクラスの属性名を変換します。例えば:

🐶Pythonコードの例を示すで

# Python code to illustrate how double  
# underscore at the beginning works
class code:
    def _single_method(self):
        pass
    def __double_method(self): # for mangling
        pass
class Pyth(code):
    def __double_method(self): # for mangling
        pass

🐶動画で動作確認してみよか?

動画で確認

二重先行および二重末尾の下線 二重の先頭と末尾のアンダースコアの別のケースがあります。 len、__ init__のような特別な変数やメソッド(マジックメソッドと呼ばれる)を使用しながらこれに従います。これらのメソッドは名前に特別な構文上の特徴を提供します。例えば、__ file__はPythonファイルの場所を示し、__ eq__はa == b式が実行されたときに実行されます。 例:

🐶Pythonコードの例を示すで

# Python code to illustrate double leading and  
# double trailing underscore works
class code:

    # '__init__' for initializing, this is a
    # special method   
    def __init__(self, ab):  
        self.ab = ab

    # custom special method. try not to use it
    def __custom__(self):  
        pass

🐶動画で動作確認してみよか?

動画で確認

Last Updated: 5/19/2019, 1:43:17 AM