2013-07-21 64 views
1

我正在處理這個小類,玩@property裝飾器。由於某種原因,它不能正常工作。爲什麼我的@property裝飾器不工作?

class Card: 
    def __init__(self, rank, suit): 
     self.rank = rank 
     self.suit = suit 

    @property 
    def rank(self): 
     return self._rank 

    @rank.setter 
    def rank(self, value): 
     valid_ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "J", "Q", "K", "A"] 
     if valid_ranks.index(value): 
      self._rank = value 

    @property 
    def suit(self): 
     return self._suit 

    @suit.setter 
    def suit(self,value): 
     self._suit = value 

    def show(self): 
     print "{}{}".format(self.rank, self.suit) 

我初始化一個對象,像這樣:Card("cheese", "ball"),想必這應該拋出一個錯誤。 Python很高興地隨身攜帶它,並指定「奶酪」來排名。這裏發生了什麼?所有其他通過賦值語法對等級制定者的調用似乎很樂意忽略我設置的制定者。我正在運行Python 2.7.5。

回答

4

您正在使用舊式類。如the documentation所述,屬性不適用於舊式類。從object導出你的課程。例如:

class Card(object): 
    ... 

在Python 3中,您不需要這樣做,因爲Python 3只有新式類。

+0

哎呦。當我看時,我沒有聽到。謝謝。 –

1

您正在初始化ranksuit屬性,但沒有下劃線,但屬性方法有_rank_suit

另外list.index如果項目不在列表中,則會引發錯誤。你應該做

if value in valid_ranks: 
+0

前者不是問題;他*希望* __init__'來調用setter。後者不是這個問題。 – kindall

+0

啊......我永遠都不會注意到這一點!我應該刪除我的答案嗎? – RussW

+0

尋找'刪除'後,我意識到,評論可能會遇到諷刺......這不是:S – RussW

相關問題