2016-11-30 8 views
2

プロパティが変更されるたびにデータを検証するクラスがあります。私はセッターが参照できるクラス変数として有効なオプションを保存したいと思いますが、私は@var.setterのオプションの中に見つかりました。私ははすべてのクラス変数を参照することができません。@ var.setter関数がクラス変数にアクセスできないのはなぜですか?

なぜですか?

コード例:

class Standard(): 
    def __init__(self): 
     self.variable1 = 1 
     self.variable2 = 2 

    @property 
    def variable1(self): 
     # This works 
     print(self.variable2) 
     return self.__variable1 

    @variable1.setter 
    def variable1(self, var): 
     # This doesn't work 
     print(self.variable2) 
     self.__variable1 = var 

x = Standard() 
print(x.variable1) 
x.variable1 = 4 
print(x.variable1) 

この出力:

AttributeError: 'Standard' object has no attribute 'variable2' 

それははっきりしません。あなたは__init__variable1を設定最初ある

+1

'self.variable2'はまだeになりませんあなたが 'self.variable1'に割り当てるときにxist。 – vaultah

+0

意図的に '__init__'に' self.variable1'を設定していますか?あるいは 'self .__ variable1'を意味しますか? –

答えて

4

self.variable1@variable1.setterによって処理されているので

def __init__(self): 
    self.variable1 = 1 
    self.variable2 = 2 

variable2はまだその時点では存在できません。あなたは可能性スワップ二行:

def __init__(self): 
    self.variable2 = 2 
    self.variable1 = 1 

が今variable2が正しくvariable1.setter実行する前に設定されています。また

、デフォルトとして動作するようにvariable2にクラス属性を与える:

class Standard(): 
    # ... 

    variable2 = 'class default' 

    @variable1.setter 
    def variable1(self, var): 
     print(self.variable2) 
     self.__variable1 = var 

またはselfgetattr()を使用します。

@variable1.setter 
def variable1(self, var): 
    print(getattr(self, 'variable2', 'not available yet')) 
    self.__variable1 = var 

やセッターを迂回し、直接__variable1を設定します。

class Standard(): 
    def __init__(self): 
     self.__variable1 = 1 # don't use the setter 
     self.variable2 = 2 
+0

うわー、あなたは私にそんなに教えてくれました!ありがとうございました! – Mallow

関連する問題