2010-12-19 57 views
0

如果我有類如下:embeding類財產清單,並調用它的價值觀

class theater: 
    def __init__(self): 
     self.__seatMatrix=[10]*5 
     self.__seats=seating[0] 
     self.__rows=len(seating) 

我如何能實現一個get/setter方法來更新值的席位? 這個想法是,座位= [10] * 5,5排,10個座位。 整個週末我都在爲此轉過頭。 當我嘗試:

def getseats(self): 
     self.__seats 

它不返回任何東西。

/Andy

回答

5

不要忘記函數實現中的return語句。與其他一些語言不同,Python不會自動返回函數中評估的最後一個表達式。沒有return語句的函數的返回值是None

在這種情況下,您的getseats()方法應該是:

def getseats(self): 
    return self.__seats 

順便說一句,如果你想在指定類的某些變量作爲半私有的(我說半,因爲完全私有變量不真的存在),Python中的慣例是使用一個下劃線(所以self._seats而不是self.__seats)。帶有雙下劃線前綴的實例變量實際上會得到名稱損壞,嘗試將其名稱強制爲私有,如果這不符合您的預期,則會產生令人驚訝的結果。

Python文檔解釋最好:http://docs.python.org/tutorial/classes.html#private-variables

1

您可以使用一個屬性包的座位一個getter/setter方法對:

@property 
def seats(self): return self.__seats 
# As Jarret pointed out, don't forget the return value 

@seats.setter 
def seats(self, value): self.__seats = value 

也可以實現__getitem____setitem__治療對象就好像它是座位列表:如前所述

def __getitem__(self, index): return self.__seats[index] 

def __setitem__(self, index, value): self.__seats[index] = value 
1

,不使用雙leadning強調,除非你是肯定你需要。這不是Java,你不必擁有私人類成員。也就是說,這不是你有問題的原因,而是缺乏返回聲明,因爲有人比我看到的更加敏銳。

無論如何,這是如何實現它在Python:

class Theater: 
    self __init__(self, seating) 
    self.seating = seating 
    self.seats = seating[0] 
    self.rows = len(seating) 

完成。注意完全缺乏getter和setter,你不需要它們。 不要試圖隱藏自己的數據。無論如何,你不能。

>>> class Theater: 
... def __init__(self, data): 
...  self.__private_data = data 
... 
>>> t = Theater("Private data") 
>>> t._Theater__private_data 
'Private data' 

哦,我想這不是私人的。 Python確實有而不是有私人成員。這是而不是 Java。