2014-05-09 24 views
0

因此,可以說我有如下名爲Car類:對Python類的實例變量的自動函數調用?

class Car(object): 
    """Car example with weight and speed.""" 
    def __init__(self): 
     self.weight = None 
     self.speed = None 

如果我初始化Car作爲一個空對象:

red_car = Car() 

我添加speedweight

red_car.speed = 60 
red_car.weight = 3500 

這一切都很好,但如果我想嘗試t時運行一個函數o將這些變量添加到實例中?像這樣的功能:

def change_weight(self, any_int): 
    return (any_int - 10) 

雖然我希望它自動運行此函數,只要我嘗試添加特定的實例變量到對象。如果可能,我希望它僅在weight實例變量上運行change_weight

我是否正確理解這一點,或者我應該分別通過函數運行整數,然後手動添加到對象中?

+0

這看起來像是一個完美的getter和setter用例。 – GWW

+1

@GWW,Noooo。這是Python而不是Java –

+1

@gnibbler:對不起,我應該說'屬性' – GWW

回答

4

您想使用屬性現在

class Car(object): 
    """Car example with weight and speed.""" 
    def __init__(self): 
     self._weight = None # internal value 
     self.speed = None 

    @property 
    def weight(self): 
     return self._weight 

    @weight.setter 
    def weight(self, the_weight): 
     self._weight = the_weight - 10 # or whatever here 

,您可以設置speed正常;當您執行car.weight = 20時,將調用setter函數,並將實際重量設置爲20 - 10 = 10

+0

所有這一次..所以等待一秒讓我看看,如果我正確理解這一點然後..你聲明稱爲'重量'與功能裝飾者'財產',但它返回到實例'_weight'(爲什麼是一個私人價值?爲什麼不只是'重量'?然後你有另一個名爲'weight'的函數,但是它上面有一個名爲'weight.setter'的裝飾器,我假設,因爲那麼當我做'car.weight = 20'時它會運行這個函數?一旦'weight.setter'函數完成,裝飾器'weight.setter'抓取另一個'weight'函數作爲返回值?大多數情況下它是有道理的。 – Matthew

+0

我只是在尋找澄清,我上面寫的是正確的,並且必須使它成爲一個私有變量'_'。 – Matthew

2

閱讀Python的概念Descriptors。特別是,它聽起來像你想定義一個自定義的__set__()方法。

例如,obj.d查找dobj字典。如果d定義了方法__get__(),則根據下面列出的優先規則調用d.__get__(obj)

或者,您可能會發現使用Properties(特定類型的描述符)更容易處理。

property()是構建數據描述符的簡潔方法,它在訪問屬性時觸發函數調用。

描述符的行爲相當符合邏輯,一旦你理解它,但它不像你所期望的那樣行爲;特別是__get__()__set__()不應該與getter和setter混淆,就像Java的概念一樣。所以看看上面的一些例子,在潛入之前和他們一起玩。

+0

有趣!會做! – Matthew