2016-01-01 18 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的电流值作为参数的结果。