代码之家  ›  专栏  ›  技术社区  ›  Raksha

如何通过引用更改类属性?

  •  0
  • Raksha  · 技术社区  · 7 年前
    class Stock:
      def __init__(self,
                   stock = 'GOOG',
                   period = '1Y',
                   interval = 86400,
                   market = 'NASDAQ'):
    
        self.stock = stock
        self.period = period
        self.inteval = interval
        self.market = market
    
        data = get_price_data({'q': stock, 'p': period, 'i': interval, 'x': market})
        self.data = data
    
    MU = Stock('MU')
    

    我希望能够更新属性,例如 MU.period = '14d' 并自动重新计算数据。

    我试着做一些像

       @period.setter
        def period(self, val):
            self._period = val
            self.data = data(self.stock, self.period, self.interval, self.market)
    

    但它抛出了一个错误 'str' object has no attribute 'setter'

    1 回复  |  直到 7 年前
        1
  •  2
  •   abarnert    7 年前

    那个 @period.setter 只有当你已经声明 period 作为一个 property 是的。

    您还需要一个getter,通常只需用首字母声明 @property 是的。

    最后,你可能想 期间 直接在原料中存放 _period 你的属性 __init__ 因为否则你就要 self.data 两次。

    所以:

    class Stock:
      def __init__(self,
                   stock = 'GOOG',
                   period = '1Y',
                   interval = 86400,
                   market = 'NASDAQ'):
    
        self.stock = stock
        self._period = period
        self.inteval = interval
        self.market = market
    
        data = get_price_data({'q': stock, 'p': period, 'i': interval, 'x': market})
        self.data = data
    
      @property
      def period(self):
          return self._period
    
      @period.setter
      def period(self, val):
          self._period = val
          self.data = data(self.stock, self.period, self.interval, self.market)
    

    你可能还想 data 只读的 @财产 当你在做的时候,要确保没有人不小心弄坏了它,但这可能是不值得的(“同意成年人”等等)。