每次在python中调用时,都会在__init__中更新自变量

时间:2017-06-03 15:30:18

标签: python class oop design-patterns self

我希望 init 中的自变量每次调用时都会更新,例如每次执行Data(10).plot时,self.plot都应该通过将self.n解析为Plot类来重新初始化。

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 个答案:

答案 0 :(得分:3)

你想要的是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以覆盖python运算符。

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

另一种方法是将Plot链接到数据,因此当数据发生变化时,绘图会这样做。一种方法就是将它作为一个属性,所以当它改变时,属性也会这样做。

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

答案 1 :(得分:1)

df = pd.DataFrame(index = data['Unnamed: 0'] + ' ' + data.columns[1:len(data.columns)]) - 对象:

中不需要n
Data