你可以从[这里](http://thinkpython2.com/code/PokerHandSoln.py)下载我给练习3写的样例代码,该代码中在 has_straightflush函数用的是默认集合。这份代码的不足就在于每次循环都要创建一个 Hand 对象,而不论是否必要。做个练习,用默认字典来该写一下这个程序。
##19.8 命名元组
很多简单的类就是一些相关值的集合。例如在15章中定义的 Point 类中就包含两个数值,x 和 y。当你这样定义一个类的时候,你通常要写一个 init 方法和一个 str 方法:
```Python
class Point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __str__(self):
return '(%g, %g)' % (self.x, self.y)
```
要传达这么小规模的信息却要用这么多代码。Python 提供了一个更简单的方式来做类似的事情:
```Python
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
```
第一个参数是你要写的类的名字。第二个是 Point 对象需要有的属性列表,为字符串。命名元组返回的值是一个类的对象。
```Python
>>> Point
<class '__main__.Point'>
```
Point 会自动提供诸如 init 和 str 之类的方法,所以就不用再去写了。
要建立一个 Point 对象,你就可以用 Point 类作为一个函数用:
```Python
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)
```
init 方法把参数赋值给按照你设定来命名的属性。 str 方法输出整个 Point 类及其属性的一个字符串表达。