2016-04-07 3 views

答えて

4

あなたはそれクラスのプライベートメソッド作り、2つの初期のアンダースコアであなたの方法__init_varの名前。名前は、サブクラスがそれと衝突しないことを確認するために変更されています。 Reserved classes of identifiers sectionから:

__*
クラスのプライベート名。このカテゴリの名前は、クラス定義のコンテキスト内で使用されると、ベースクラスと派生クラスの「プライベート」属性間の名前の衝突を避けるために、変更されたフォームを使用するように書き直されます。

Identifiers (Names) sectionで:をマングリング

プライベート名前:原文どおりクラス定義で発生した識別子は、二つ以上の下線文字で始まり、二つ以上のアンダースコアで終わっていません、そのクラスのプライベートな名前と見なされます。プライベート名はコードが生成される前に長い形式に変換されます。この変換では、先頭にアンダースコアが削除され、アンダースコアが1つ挿入されたクラス名が挿入されます。たとえば、Hamという名前のクラスにある識別子__spam_Ham__spamに変換されます。

のでA.__init_varA._A__init_varに変更され、そしてA.__init__()A._A__init_var()を呼び出すように変更されます。

class A: 
    def __init__(self): 
     self._init_var() 

    def _init_var(self): 
     self.var = 11 

class B(A): 
    def __init__(self): 
     A.__init__(self) 

    def _init_var(self): 
     self.var = 10 
:そう_init_varという名前を付け、それらの最初のアンダースコアの1つを削除

>>> dir(A) 
['_A__init_var', '__doc__', '__init__', '__module__'] 
>>> import dis 
>>> dis.dis(A.__init__) # disassemble the bytecode for A.__init__ 
    3   0 LOAD_FAST    0 (self) 
       3 LOAD_ATTR    0 (_A__init_var) 
       6 CALL_FUNCTION   0 
       9 POP_TOP 
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE 
>>> dir(B) 
['_A__init_var', '_B__init_var', '__doc__', '__init__', '__module__'] 

:それは別の名前を持っているので、名前を変更B._B__init_var()メソッドが呼び出されることはありません

関連する問題