2012-05-31 35 views
0

我遇到了我的類文件的問題,我似乎無法找到解決它的問題。我希望有人能指出我正確的方向。修復類的方法循環

這裏是我的代碼:

class Car: 
    def __init__(self, year_model, make, speed): 
     self.__year_model = year_model 
     self.__make = make 
     self.__speed = 0 

    def set_year_model(self, year_model): 
     self.__year_model = year_model 

    def set_make(self, make): 
     self.__make = make 

    def get_year_model(self): 
     return self.__year_model 

    def get_make(self): 
     return self.__make 

    def accelerate(self): 
     self.__speed + 5 
     return self.__speed 

    def decelerate(self): 
     self.__speed - 5 
     return self.__speed 

    def get_speed(self): 
     return self.__speed 

從本質上講,我想要的速度屬性設置爲0,並有3種方法(加速,減速和get_speed)的加減5的速度屬性,並最終迴歸速度屬性,因此可以打印。

我猜想我的格式有問題,但我似乎無法找到修復該類的正確安排。

真正的程序設想循環加速方法5次,但類方法應該處理順序加法和返回最終速度。

import car 

user_year = 1995 
user_make = "toyota" 
user_speed = 0 

user_car = car.Car(user_year, user_make, user_speed) 

for count in range(1,6): 
user_car.accelerate() 

print user_car.get_speed() 

我知道這段代碼很脆弱,但這些都是幫助我使問題更清楚的臨時工。 所以希望這不是太混亂,我可以得到答案。

+1

你的問題也是因爲你在Python編寫Java語法... – JBernardo

+0

要詳細說明Jbernardo的聲明,請參閱[本文](http://tomayko.com/writings/getters-setters-fuxors)。除非需要,否則不要編寫getter和setter,然後使用[property](http://docs.python.org/library/functions.html#property)。另請參閱:[Python不是Java](http://dirtsimple.org/2004/12/python-is-not-java.html)。 – Darthfett

回答

5

self._speed + 5計算當前速度加5.但實際上並沒有在任何地方存儲計算值。你想使用self._speed = self._speed + 5,或者更常用的形式,self._speed += 5

+0

尷尬...我退出了。 – Jertise

0

問題是,當然,缺少「+ =」和「 - =」部分,但我會更進一步,並建議如果您正在編寫新的Python代碼,您會熟悉新風格類。在一個新的樣式類,你的代碼可以寫成如下:

class Car(object): 
    def __init__(self, year_model, make, speed): 
     self.year_model = year_model 
     self.make = make 
     self.speed = 0 

    def __set_year_model(self, year_model): 
     self.__year_model = year_model 

    def __set_make(self, make): 
     self.__make = make 

    def __set_speed(self, speed): 
     self.__speed = speed 

    def __get_year_model(self): 
     return self.__year_model 

    def __get_make(self): 
     return self.__make 

    def accelerate(self): 
     self.speed += 5 

    def decelerate(self): 
     self.speed -= 5 

    def __get_speed(self): 
     return self.__speed 

    speed = property(fget=__get_speed,fset=__set_speed,fdoc="Set or Retrieve the current speed of this instance of the Car object") 
    make = property(fget=__get_make,fset=__set_make,fdoc="Set or Retrieve the make of this instance of the Car object") 
    year_model = property(fget=__get_year_model,fset=__set_year_model,fdoc="Set or Retrieve the Year and Model of this instance of the Car object") 

此外,在主文件中的代碼更改:

import car 

user_year = 1995 
user_make = "toyota" 
user_speed = 0 

user_car = car.Car(user_year, user_make, user_speed) 

for count in range(1,6): 
    user_car.accelerate() 

print user_car.speed 
+1

更好的是使用[@property](http://docs.python.org/library/functions.html#property)裝飾器。然而,如果你真的想改變一個屬性的訪問方式(Python屬性保留'object.attribute'接口),那麼編寫setter/getters就是很好的選擇。另外,如果你使用python 3.x,類將自動從'object'繼承。 – Darthfett

+0

儘管我普遍同意你的評論,但這張海報似乎是在編寫一個非常舊的Python版本的代碼 - 我試圖明確地使用屬性,並且以一種他/她可以閱讀而不需要做太多閱讀的方式關於裝飾者。我可能應該使用裝飾器寫出來,幷包括解釋...隨意編輯答案並添加它:)。 –

+0

我沒有注意到他使用'print'作爲聲明。除此之外,我沒有看到任何表明他的python版本「非常老」的東西(我錯過了什麼?)。對於某些人來說,通常來自像Java這樣的語言,並且編寫setter/getters,這對python沒有任何好處,因此我想在這個例子中展示屬性的無用性。 – Darthfett