2013-04-07 40 views
4

我想弄清楚封裝在Python中。我在shell中做了一個簡單的小測試,看看有什麼工作,它不像我期待的那樣工作。我無法實現它的工作。這裏是我的代碼:訪問器和變異器方法(Python)

class Car: 
    def __init__(self, carMake, yrMod): 
     self.__make = carMake 
     self.__yearModel = yrMod 
     self.__speed = 0 

    #Mutator Methods 
    def set_make(self, make): 
     self.__make = carMake 

    def set_model(self, yrMod): 
     self.__yearModel = yrMod 

    #def set_speed(self, speed): 
     #self.__speed = speed 

    #Accessor Methods 
    def get_make(self): 
     return self.__make 

    def get_yearModel(self): 
     return self.__yearModel 

    def get_speed(self): 
     return self.__speed 

myCar=Car('Ford', 1968) 
myCar2=Car('Nissan', 2012) 
myCar.get_make() 
'Ford' 
myCar.set_make=('Porche') 
myCar.get_make() 
'Ford' 

爲什麼myCar.set_make不能將福特換成保時捷?謝謝。

+2

實例屬性中的所有下劃線是什麼,例如'自.__ speed'?而且你爲什麼要做所有這些方法呢?你認爲'myCar.set_make(「Porsche」)/ myCar.get_make()'會通過myCar.make ='Porsche''和'myCar.make'提供什麼優勢? – DSM 2013-04-07 20:56:18

+3

從來沒有理由公開這樣的API。有時有getter/setter方法的理由,但是它們應該使用內置的'property'來隱藏。因爲這使得它們像客戶端代碼的普通屬性一樣,所以你應該只使用那些(而不是微不足道的getter/setter),直到你需要邏輯。 – delnan 2013-04-07 20:57:17

回答

6

myCar.set_make=('Porche'),您將此成員設置爲Car類作爲'Porche'字符串,但您不調用該方法。

只需卸下=來解決它:

myCar.set_make('Porche') 
myCar.get_make() # Porche 

此外,由於@DSM指出,存在的set_make參數錯誤:

def set_make(self, make): 
    self.__make = make # carMake is not defined! 

然而,this use of getters and setters in Python is strongly discouraged。如果您因任何原因需要類似的東西,請考慮使用properties

+3

''set_make''('carMake'而不是'make')也存在一個錯誤,所以它現在還不能正常工作,但是你說的主要問題是正確的。 – DSM 2013-04-07 20:57:14

+0

謝謝你,但由於某種原因,我收到一條錯誤消息: – user2255444 2013-04-07 20:57:22

+0

謝謝你,這些結合的建議奏效。 – user2255444 2013-04-07 21:04:30

-1
new_car = Car(...) 
new_car2 = Car(...) 

new_car._make = 'Ford' 
new_car2.make = 'Jetta' 

print new_car._make 
print new_car2.make 
+1

這個答案有什麼價值增加了​​這個問題?既然你花時間來張貼這個問題作爲對一個古老問題的答案,我很好奇。 – EWit 2014-08-18 22:29:12