2017-06-05 12 views
-1

3つのインスタンス属性 'a'、 'b'、および 'c'を持つクラスがあり、プロパティセッターでそれぞれ初期化されているとします。さて、私のプロパティ 'b'の代入は、インスタンス変数 'a'の値を使うべきです。したがって、 'b'を初期化するには、 'a'をあらかじめ初期化しておく必要があります。プロパティは指定された順序で設定されていますか?

以下のコードに従うと、pythonはインスタンス 'a'を最初に設定し、次にインスタンス 'b'に行き、finnally 'c'に進みます。または、初期化がランダムな順序で行われる可能性があります変数を正常に初期化するには?

class Foo(object): 

    def __init__(self): 
     self.a = None 
     self.b = None 
     self.c = None 

    @property 
    def a(self): 
     return self._a 

    @a.setter 
    def a(self, value): 
     self._a = value 

    @property 
    def b(self): 
     return self._b 

    @b.setter 
    def b(self, value): 
     value = self.a 
     self._b = value 

    @property 
    def c(self): 
     return self._c 

    @c.setter 
    def c(self, value): 
     value = self.b 
     self._c = value 

私は実際のケースでは困難を抱えているため、この質問を簡略化した形でお願いしています。その場合は、ログを使用して初期化の実行の実行を表示し、最初に 'a'の代わりに最後のプロパティ(この場合は 'c')を実行することで開始するように見えます。

+3

あなたはそれぞれの設定者に 'print'を置くことで、これを簡単に実証することができます - はい、設定者は' __init__'が示唆する順序で呼び出されます。実際の問題を示す[mcve]を与えてください。 – jonrsharpe

+0

@jonrsharpe:あなたが試した特定の時間だけ、その順序で実行されたセッターを実証することができます。これは一般的なものではありません。 – user2357112

+0

私は問題の原因となっていたエラーを見つけることができました。それは実際に実行の順序ではなく、私が作っていたクラスの継承にありました。これを印刷物で見ることができるという最初の答えは正しいです。ありがとうございました –

答えて

2

__init__はPythonの他の方法と同様です。その中のステートメントは指定された順序で実行されるので、例コードではbより前にaが設定されています。これはcより前に設定されています。

一般に

ザPython言語仕様は、C/C++(次いで例えばa, b, c = d, e, f次いでdが最初に読み出されることを保証し、ef、及びaが最初に設定されている、bc)などの言語より強い順序付け保証を提供します。

プロパティー、プレーン属性などは問題ではありません。割り当てはファンキーなことをするかもしれませんが、それらのことはステートメントが出現する順序で起こります。

関連する問題