2017-05-04 39 views
1

這是有效的。瞭解是否需要明確添加()以獲得評估

class Bob(object): 
    def __init__(self, xvals): 
     self.xvals = xvals 
    def get_xmax(self): 
     return max(self.xvals) 

bob = Bob([3, 1, 2]) 
print bob.get_xmax() # returns 3 

bob.xvals = [-3, -1, -2] 
print bob.get_xmax() # returns -1 

這並不是因爲max()在實例化過程中僅評估一次。

class Bob(object): 
    def __init__(self, xvals): 
     self.xvals = xvals 
     self.xmax = max(self.xvals) # evaluated during instantiation 

bob = Bob([3, 1, 2]) 
print bob.xmax # returns 3 

bob.xvals = [-3, -1, -2] 
print bob.xmax # still returns 3, not -1 

有一個簡單的(和Python的)方式來獲得bob.xmax當前的最大與返回了()或者是點 - 潛在的昂貴的操作應要求()爲你所要求的多提醒只是一個對象的引用?

+0

您可以引入getter和setter方法並在setter方法中更新'xmax'。 – Michael

回答

3

您可以使用property

class Bob(object): 
    def __init__(self, xvals): 
     self.xvals = xvals 

    @property 
    def xmax(self): # called when `xmax` attribute is accessed 
     return max(self.xvals) 

>>> bob = Bob([3, 1, 2]) 
>>> bob.xmax 
3 
>>> 
>>> bob.xvals = [-3, -1, -2] 
>>> bob.xmax 
-1 

另外,您還可以定義setter屬性,使xmax只計算一次。 bob.xvals.append(999)因爲它不會觸發setter方法invokation:

class Bob(object): 
    def __init__(self, xvals): 
     self.xmax = None 
     self.xvals = xvals 

    @property 
    def xvals(self): 
     return self._xvals 

    @xvals.setter 
    def xvals(self, values): 
     self._xvals = values 
     self.xmax = max(values) 

注意:如果你這樣做的setter方法是行不通的。

+0

@uhoh,我不明白你的意思。順便說一句,我添加了另一個使用setter的例子。 – falsetru

+0

我明白你現在在做什麼,這真的非常棒,謝謝! – uhoh

+1

@uhoh,不客氣。快樂的Python! – falsetru

相關問題