Python拾珍:8. 命名元组

很多简单的对象其实都可以看作是几个相关值的集合。例如,Point 对象,通常包含两个数字,即 x 和 y。定义一个这样的类时,通常从 init 方法和 str 方法开始:

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 提供了一个更简洁的方式来表达同一个意思:

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])

第一个参数是我们想要创建的类名。第二个参数是 Point 对象应当包含的属性的列表,以字符串表示。namedtuple 的返回值是一个类对象:

namedtuple 的返回值是一个类对象

这里 Point 类会自动提供 initstr 这样的方法,所以我们不需要写它们。

要创建一个 Point 对象,可以把 Point 类当作函数来用:

Point 类当作函数来用

init 方法使用我们提供的名字把实参赋给属性。str 方法会打印出 Point 对象及其属性的字符串表示。

可以使用名称来访问命名元组的元素:

使用名称来访问命名元组的元素

也可以直接把它当作元组来处理:

直接把它当作元组来处理

命名元组提供了快速定义简单类的方法,但其缺点是简单的类并不会总保持简单。可能之后我们需要给命名元组添加方法。如果有这样的需要,我们可以定义一个新类,继承当前的命名元组:

class Pointier(Point):
    #  在这里添加更多的方法

本文参考自《像计算机科学家一样思考Python (第2版)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,521评论 19 139
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 9,671评论 4 16
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,958评论 18 399
  • 爱摄影的奥派阅读 1,020评论 0 0
  • 用尽一生去爱,却只换来半生的缘分。 在张爱玲的《半生缘》里,当过尽千帆的曼桢,把自己的遭遇告诉了世钧,不禁感叹,原...
    婉长阅读 6,151评论 7 13