映射到工厂函数说明中的元组值

时间:2016-01-01 22:47:06

标签: python class dictionary mapping tuples

我遇到了掌握面向对象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 )

2 个答案:

答案 0 :(得分:3)

没有特殊的语法。 class_只是一个变量。由于调用了dict的get方法,最终会引用其中一个类AceCardFaceCardNumberCard。因此,class_(rank_str, suit)就像调用AceCard(rank_str, suit)FaceCard(rank_str, suit)NumberCard(rank_str, suit)一样(取决于为给定输入选择的类)。

第2行的分配就像a, b = 1, 2一样。它在一个赋值中分配两个变量。 (这两个值取自dict。你可以看到dict中的每个值都是两个元素的元组。)

  

如果class_是一个类,那么为什么在它从未被引用时需要在构造函数中使用?是因为* Card类将它作为构造函数中的参数吗?

答案 1 :(得分:2)

未命名字典中的值都是两个值的元组。如果rank与其中一个键匹配,则变量class_rank_str将分别指定相应的元组值。如果没有,那么他们将被分配NumberCard类和str(rank) - 所以这些是默认值。

最后,card()函数返回调用分配给class_变量的类的结果,并将当前值rank_strsuit作为参数传递给它。