我遇到了掌握面向对象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 :(得分:3)
没有特殊的语法。 class_
只是一个变量。由于调用了dict的get
方法,最终会引用其中一个类AceCard
,FaceCard
或NumberCard
。因此,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_str
和suit
作为参数传递给它。