2012-12-26 41 views
0

我已經用構造函數構建了一個類。這個想法是,如果沒有指定等級和/或套裝,默認情況下應該隨機生成一個PlayingCard對象。如果指定了無效的服裝或等級,則不應創建對象。我相信這是行得通的,但我不知道該怎麼做例外。我想驗證在排名或訴訟無效的情況下拋出的唯一例外是我指定的例外。我很困惑爲什麼有一個'NameError'說實例沒有'suit'屬性,因爲我在編寫raise語句時沒有指定它。類和異常

另外,我想使課堂靈活,使用戶定義的點數和花色不需要創建實例時傳遞的字符串,但我似乎無法得到它的工作。如果有人能指出我正確的方向或解釋爲什麼我不想這樣做,這將不勝感激。

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' 
+2

旁白:不是'PlayingCard.ranks [rand.randint(0,12)]',你可以用'rand.choice( PlayingCard.ranks)'或'rand.choice(self.ranks)'。 (假設你的'rand'是'random'模塊。) – DSM

回答

6

rankNone,也沒有在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') 
+0

謝謝@minitech。在這種情況下,如果點數和花色是無效的,例外只表明等級超出範圍,因爲這是運行第一位。我認爲這是足夠的,但我想指定哪些參數爲了完整起見而特別無效。 – cdelsola

+0

@ user1816858:啊,好了,你可以使用幾個標誌,但我認爲它會做太多混亂是值得的,個人... – Ryan