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)

so: のようにオブジェクトを初期化する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

rankアンダースコアなしでandsuit属性を初期化していますが、プロパティ メソッドには_rankandがあり_suitます。

項目list.indexがリストにない場合にもエラーをスローします。代わりに行う必要があります

if value in valid_ranks:
于 2013-07-21T22:43:30.530 に答える