2017-01-15 10 views
0

Pythonでは、内のクラス変数の現在の値にがアクセスできるのでしょうか?例えばセッターのプロパティの現在値へのアクセス

:C#で

# Getter 
@property 
# ... 

# Setter 
@position.setter 
def position(self, value): 
    # Do something with current value... 
    # self.position, self.__position, position and __position don't seem to work 

    # Update position with the given value 
    self.__position = value 

    # Do something with the new value... 

相当するものは次のようになります。

private Position position; 

public Position Position 
{ 
    get 
    { 
     // ... 
    } 

    set 
    { 
     // Do something with the current value... 

     // Update position field with given object 
     position = value; 

     // Do something with the new value... 
    } 
} 

更新
ここでは、より良い私の質問を説明するために、最小限の完全な、かつ検証例です。

class C: 
    def __init__(self): 
     self.x = 2 

    @property 
    def x(self): 
     return self.__x 

    @x.setter 
    def x(self, value): 
     print(self.x) 
     self.__x = value 
     print(self.x) 

c = C() 

次のエラーがスローされます。xがあり、その時点で

AttributeError: 'C' object has no attribute '_C__x' 

セッターはそれを更新する前に、変数の現在の値を印刷しようとするので、これが発生し、x__init__内の2に設定されているときにセッターが実行され、以前に値が割り当てられていない(印刷する現在の値はありません)。

+1

:同じ結果が得られ

class C: def __init__(self): self.x = 2 @property def x(self): try: return self.__x except AttributeError: # I return "None" here but you could also do something else return None @x.setter def x(self, value): print(self.x) self.__x = value print(self.x) 

をあなたは*「うまくいかない」*を意味しますか?あなたがそれに割り当てられるまで、 'self .__ position'は依然として古い値であり、' self.position'もまた古い値にアクセスします。 – jonrsharpe

+0

それは私が考えていたものですが、セッター内で 'self.position'または' self .__ position'にアクセスしようとすると、次のエラーが発生します: 'AttributeError: 'GameObject'オブジェクトに '_GameObject__position''属性がありません。 ( 'GameObject'は' position'変数を含むクラスです) – Ruben9922

+0

[mcve]を付けてください。また、manglingが名前を不必要に複雑にするので、 '__double_underscore'を削除することを検討してください。 – jonrsharpe

答えて

1

__init__self.x(セッターを使用)を設定しました。しかし、x.setterでは実際に値を設定する前にprint(self.x)(ゲッターを使用)を使用します。

あなたはそれを動作させるために(クラス属性などなど)のデフォルト値を定義することができます。

class C: 
    __x = None 

    def __init__(self): 
     self.x = 2 

    @property 
    def x(self): 
     return self.__x 

    @x.setter 
    def x(self, value): 
     print(self.x) 
     self.__x = value 
     print(self.x) 

>>> c = C() 
None 
2 

注意をダブル下線変数が"name mangling"を受け、大会は1ではなく、単一の下線の変数を使用することであること。

もう一つの方法は、それをアクセスするためにtryになると、それは下盛ないならば、何か他のものを返す(または他の何かやる)になります。何

>>> c = C() 
None 
2 
+0

ちょうど不思議なことに、変数を静的に(__init__の外側で '__x'を初期化せずに)行わずにこれを行う方法はありますか? – Ruben9922

+0

@ Ruben9922 "getter"で例外をキャッチする別の方法を追加しました。それはあなたの質問に答えますか?あなたのセッターの最初の 'print'ステートメントの周りに' try'、 'except'を実行することもできます。属性がまだ設定されていない場合は、スキップしてください。 – MSeifert

+0

よろしいですか?うん、それは私の質問に答える - ありがとう! – Ruben9922

関連する問題