2017-06-03 188 views
0

我想在init中每次调用它时更新自变量,例如,每次我执行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 

又如:当我执行下面的代码,我想要的答案变量等于16.相反,它等于20.如何实现上述类别内的这种行为?

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

回答

2

你想要的是一个property。这是一种特殊类型的属性,在获取该值时调用自定义getter函数,因此您可以使其动态返回正确的绘图。

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覆盖蟒蛇运营商。

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

谢谢,这似乎是个伎俩。关于您最后的评论,我想知道您是否知道任何设计模式或属性以允许我将这两个类之间的数据链接起来? – DDRRpy

1

你并不需要在Data -object n

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