2017-06-03 4 views
0

内にある自分自身の変数を更新する必要があります。 Data(10).plotを実行するたびに、self.plotはself.nをPlotクラスに解析することによって再初期化する必要があります。Pythonで呼び出されるたびに__init__内の自己変数を更新します。

class Data(object): 
    def __init__(self, n): 
     self.n = n 
     self.plot = Plot(self.n) 

    def minus(self, x): 
     self.n -= x 
     return self.n 


class Plot(object): 
    def __init__(self, n): 
     self.n = n 

    def double(self): 
     return self.n * 2 

別の例を:私は次のコードを実行すると、私は答え変数が代わりにそれは20.私は上記のクラス内でこの動作を実装するにはどうすればよい等しい16に等しくなるようにしたいですか?あなたはData -objectでnを必要としない

data = Data(10) 
data.minus(2) 
answer = vcf.plot.double()) 

答えて

2

あなたが望むものはpropertyです。これは、値を取得するときにカスタムゲッター関数を呼び出す特別なタイプの属性です。したがって、正しいプロットを動的に返すことができます。

class Data(object): 
    def __init__(self, n): 
     self.n = n 

    @property 
    def plot(self): 
     return Plot(self.n) 

    def __sub__(self, x): 
     return Data(self.n - x) 

補足として、the data modelを参照して、Python演算子を上書きしてください。

data = Data(10) 
data -= 2 
answer = data.plot.double() # Calls the `plot()` function to get a value for `data.plot`. 
print(answer) # 16 

もう一つの方法は、データの変更は、プロットはしないそう際、データへのプロットをリンクすることです。それを行う方法は、それを属性として持つことだけです。したがって、属性が変更されたときにも、属性がそれを行います。

class Plot(object): 
    def __init__(self, data): 
     self.data = data 

    @property 
    def n(self): 
     return self.data.n 

    @n.setter 
    def n(self, x): 
     self.data.n = x 

    def double(self): 
     return self.n * 2 

data = Data(10) 
plot = Plot(data) 
data.minus(2) 
answer = plot.double() # 16 
+0

ありがとう、これはトリックを行うようです。あなたの最後のコメントについて、2つのクラスの間でデータをリンクするためのデザインパターンや属性が分かっているのでしょうか? – DDRRpy

1

class Data(object): 
    def __init__(self, n): 
     self.plot = Plot(n) 

    def minus(self, x): 
     self.plot.n -= x  


class Plot(object): 
    def __init__(self, n): 
     self.n = n 

    def double(self): 
     return self.n * 2 
関連する問題