2016-01-01 42 views
-1

我遇到了掌握面向對象的Python中的代碼片段。映射到工廠函數中的值元組說明

我不明白第2行的語法。我知道rank_str是一個字典。什麼是class_,語法,它在做什麼?

我不明白的其他部分是在第8行。如果class_是一個類,那麼爲什麼在構造函數中不需要suit?是因爲* Card類在構造函數中將它作爲參數嗎?

1. def card(rank, suit): 
2. class_, rank_str= { 
3.  1: (AceCard,'A'), 
4.  11: (FaceCard,'J'), 
5.  12: (FaceCard,'Q'), 
6.  13: (FaceCard,'K'), 
7.  }.get(rank, (NumberCard, str(rank))) 
8. return class_(rank_str, suit) 
+0

您是否閱讀過['dict.get()'](https://docs.python.org/2/library/stdtypes.html#dict.get)方法的文檔? – martineau

+0

@martineau是的。 –

回答

3

沒有特別的語法。 class_只是一個變量。由於對字典的get方法的調用,它將結束參考類別AceCard,FaceCardNumberCard中的一個。因此class_(rank_str, suit)就像調用AceCard(rank_str, suit)FaceCard(rank_str, suit)NumberCard(rank_str, suit)(取決於爲給定輸入選擇哪個類)。

第2行的排版就像a, b = 1, 2一樣。它在一項任務中分配兩個變量。 (這兩個值是從字典服用。你可以看到,在字典的每個值是兩個元素的元組)。

如果class_是一個類,那麼爲什麼訴訟需要在構造函數時,這是從來沒有提到?是因爲* Card類在構造函數中將它作爲參數嗎?

是的。

+0

好的。我明白。我意識到'a,b = 1,2'的語法,但我認爲它過於複雜,並且混淆了書中'class_'變量名的使用,並認爲它是某種匿名類。很好的解釋,謝謝。 –

2

未命名字典中的值都是兩個值的元組。如果rank與其中的一個鍵匹配,變量class_rank_str將分別指定相應的元組值。如果沒有,那麼他們將被分配NumberCard類和str(rank) - 所以這些是默認值。

最後,card()函數然後返回調用分配給class_變量類,並向其傳遞的rank_strsuit的電流值作爲參數的結果。