0

コンストラクターを使用して以下のクラスを作成しました。ランクやスーツが指定されていない場合、デフォルトでPlayingCardオブジェクトがランダムに生成されるという考え方です。無効なスーツまたはランクが指定されている場合は、オブジェクトを作成しないでください。これは機能していると思いますが、例外をどうすればよいかわかりません。無効なランクまたはスーツの場合にスローされる唯一の例外が、指定したものであることを確認したかったのです。raiseステートメントを記述したときにこれを指定しなかったため、インスタンスに属性「suit」がないことを示す「NameError」がある理由がわかりません。

また、インスタンスを作成するときにユーザー定義のランクとスーツを文字列として渡す必要がないようにクラスを柔軟にしたいと思いますが、それを機能させることができないようです。誰かが私を正しい方向に向けたり、私がこれをしたくない理由を説明したりすることができれば、それはありがたいです。

class PlayingCard:
    ranks = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
    suits = ['Spades', 'Hearts', 'Clubs', 'Diamonds']

    def __init__(self, rank = None, suit = None):
        if rank is None: self.rank = PlayingCard.ranks[rand.randint(0,12)]
        elif rank in PlayingCard.ranks: self.rank = rank


        if suit is None: self.suit = PlayingCard.suits[rand.randint(0,3)]
        elif suit in PlayingCard.suits: self.suit = suit


        if self.rank not in PlayingCard.ranks or self.suit not in PlayingCard.suits: raise NameError('Invalid Suit or Rank')


>>> c1 = PlayingCard('15','Diamonds')

Traceback (most recent call last):
  File "<pyshell#63>", line 1, in <module>
    c1 = PlayingCard('15','Diamonds')
  File "C:\Python27\poker.py", line 26, in __init__
    if self.rank not in PlayingCard.ranks or self.suit not in PlayingCard.suits: raise NameError('Invalid Suit or Rank')
AttributeError: PlayingCard instance has no attribute 'rank'

>>> c2 = PlayingCard('A', 'Swords')

Traceback (most recent call last):
  File "<pyshell#64>", line 1, in <module>
    c2 = PlayingCard('A', 'Swords')
  File "C:\Python27\poker.py", line 26, in __init__
    if self.rank not in PlayingCard.ranks or self.suit not in PlayingCard.suits: raise NameError('Invalid Suit or Rank')
AttributeError: PlayingCard instance has no attribute 'suit'
4

1 に答える 1

6

rankでなくNone、ではない場合ranksself.rankは決して設定されません。

if self.rank not in PlayingCard.ranks

動作しません。self.rank存在しません。についても同様ですsuit。エラーをより具体的にして、問題を一度に解決できます。

def __init__(self, rank = None, suit = None):
    if rank is None: self.rank = PlayingCard.ranks[rand.randint(0,12)]
    elif rank in PlayingCard.ranks: self.rank = rank
    else: raise NameError('Invalid rank')

    if suit is None: self.suit = PlayingCard.suits[rand.randint(0,3)]
    elif suit in PlayingCard.suits: self.suit = suit
    else: raise NameError('Invalid suit')
于 2012-12-26T19:02:23.383 に答える