2017-09-03 8 views
-2

このトピックに関するすべての同様の記事を読んだことがありますが、何が起こっていたのか把握するのに役立つ方法で私の問題に関連するものは見つかりませんでした。'super'オブジェクトには '_Parent__method'属性はありません

class A: 
    def __init__(self, value): 
     self.__value = value 
     self.__conn = httpsconnection # Specifics don't matter 

class B(A): 
    def __init__(self, id, type, value): 
     super().__init__(value) 
     self.data = self.__create_sub_class(id, type) 

    def __create_sub_class(self, id, type): 
     self.__conn.request(...) 
     ... 
     return data 

class C(B): 
    def __init__(self, id, value): 
     super().__init__(id, externalVariable, value) 

私は取得していますエラーがAttributeError: 'C' object has no attribute '_B__conn'

クラスCAからそれを継承しBから変数を継承するべきではないでしょうか?

+2

なぜ二重アンダースコアの名前を使用していますか?継承性を避けるために明示的に設計されています。 –

+0

https://docs.python.org/3/tutorial/classes.html#private-variables – NPE

+0

@MartijnPietersこれらは私の個人的な変数です。私がプログラムを覚えていたとき、私は別の言語で習った習慣です。 – Spedwards

答えて

1

サブクラスでこれらの名前を使用する場合は、先頭の二重アンダースコア名を使用しないでください。 __nameは、名前をプライベートというプライベートクラスにするために明示的に設計されています。考え方は、サブクラスが使用できる名前を制限することなく、そのような名前をフレームワークで使用できることです。

このような名前は、コンパイル時にをマングルしたです。接頭辞は_ClassNameです(現在のクラス名)。あなたは名前が内部であることを知らせるためにしたい場合は、単純に、単一のアンダースコアの名前を使用します(Pythonは名前が常にアクセスされている、実際のプライバシーのモデルを持っていません):

class A: 
    def __init__(self, value): 
     self._value = value 
     self._conn = httpsconnection # Specifics don't matter 

class B(A): 
    def __init__(self, id, type, value): 
     super().__init__(value) 
     self.data = self._create_sub_class(id, type) 

    def _create_sub_class(self, id, type): 
     self._conn.request(...) 
     ... 
     return data 

は、字句解析のドキュメントでReserved classes of identifiersを参照してください。 __*
クラスプライベート名。このカテゴリの名前は、クラス定義のコンテキスト内で使用されると、ベースクラスと派生クラスの「プライベート」属性間の名前の衝突を避けるために、変更されたフォームを使用するように書き直されます。

、参照documentation on names:をマングリング

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

+0

ありがとうございます。私は全体の名前 - manglingについて知りませんでした。私はなぜか分かりませんが、私はいつもダブルアンダースコアをシングルより優先して使用しました。私は今それを変えなければならないと思う。 – Spedwards

関連する問題