我正在研究这个小班,和@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。
答案 0 :(得分:4)
您正在使用旧式课程。如the documentation中所述,属性不适用于旧式类。从object
派生您的课程。 E.g:
class Card(object):
...
在Python 3中,您不需要这样做,因为Python 3只有新式的类。
答案 1 :(得分:1)
您正在初始化rank
和suit
属性而不使用下划线,但您的属性方法包含_rank
和_suit
。
如果项目不在列表中,list.index
也会引发错误。你应该做
if value in valid_ranks: