Python 3.x 如何更新Python类中的链接属性而不重复代码和不必要的计算?

Python 3.x 如何更新Python类中的链接属性而不重复代码和不必要的计算?,python-3.x,oop,attributes,finance,Python 3.x,Oop,Attributes,Finance,我正在用Python实现一个简单的black-scholes(期权定价模型)。以下是我目前的代码: import math from scipy.stats import norm class Option: def __init__(self, spot, strike, tte, int_rate, b, vol): self.spot = spot self.strike = strike self.tte = tte

我正在用Python实现一个简单的black-scholes(期权定价模型)。以下是我目前的代码:

import math
from scipy.stats import norm


class Option:
    def __init__(self, spot, strike, tte, int_rate, b, vol):
        self.spot = spot
        self.strike = strike
        self.tte = tte
        self.int_rate = int_rate
        self.b = b
        self.vol = vol

    @property
    def _d1(self):
        return (math.log(self.spot / self.strike) + (self.b + self.vol ** 2 / 2.0) * self.tte) / (self.vol * math.sqrt(self.tte))

    @property
    def gamma(self):
        return math.exp((self.b - self.int_rate) * self.tte) * norm.pdf(self._d1) / (self.spot * self.vol * math.sqrt(self.tte))

    @property
    def vega(self):
        (self.spot * math.exp((self.b - self.r) * self.tte) * norm.pdf(self._d1) * math.sqrt(self.tte))
上述方法的问题是速度比需要的慢。例如,如果我访问vega,即使没有任何更改,它也需要重新计算整个树

当我在这个类的实例中更新一个属性时,我希望所有使用这个属性的属性也被更新。例如,当我更改
spot
时,中间的
d1
术语应该更新,以及
gamma

另一种方法是一种名为
set\u-spot
的方法,它可以更新下游的所有内容。然而,在这种情况下,我需要类似的方法,比如
set\u strike
,这将是非常重复的

我最好的想法是用一种方法更新所有内容,如下所示:

    def update_greeks(self):
        d1 = (math.log(self.spot / self.strike) + (self.b + self.vol ** 2 / 2.0) * self.tte) / (
                    self.vol * math.sqrt(self.tte))
        d2 = d1 - self.vol * math.sqrt(self.tte)

        self.gamma = math.exp((self.b - self.int_rate) * self.tte) * norm.pdf(d1) / (
                        self.spot * self.vol * math.sqrt(self.tte))

        self.vega = (self.spot * math.exp((self.b - self.r) * self.tte) * norm.pdf(d1) * math.sqrt(self.tte)) 

尽管我更喜欢模块化的方法(随着我添加更多功能,这种方法会变得更大)。是否有一种方法可以实现这两个目标(没有不必要的计算,没有重复的代码)