为什么我的@property装饰工作不起作用?

时间:2013-07-21 22:39:17

标签: python python-2.7 decorator

我正在研究这个小班,和@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很乐意与它一起滚动并指定“奶酪”排名。这里发生了什么?通过赋值语法对排名设置器的所有其他调用似乎很高兴地忽略了我已经实现的setter。我正在运行Python 2.7.5。

2 个答案:

答案 0 :(得分:4)

您正在使用旧式课程。如the documentation中所述,属性不适用于旧式类。从object派生您的课程。 E.g:

class Card(object):
    ...

在Python 3中,您不需要这样做,因为Python 3只有新式的类。

答案 1 :(得分:1)

您正在初始化ranksuit属性而不使用下划线,但您的属性方法包含_rank_suit

如果项目不在列表中,list.index也会引发错误。你应该做

if value in valid_ranks: