2013-07-21 34 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

相关问题