コンストラクターを使用して以下のクラスを作成しました。ランクやスーツが指定されていない場合、デフォルトで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'