1

我正在研究这个小类,使用@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

2 回答 2

4

您正在使用旧式课程。如文档中所述,属性不适用于旧式类。从object. 例如:

class Card(object):
    ...

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

于 2013-07-21T22:42:11.283 回答
1

您正在初始化不带下划线的rankandsuit属性,但您的属性方法具有_rankand _suit

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

if value in valid_ranks:
于 2013-07-21T22:43:30.530 回答