PYTHON 3 初探 第 2 部分

上传人:豆浆 文档编号:24903011 上传时间:2017-12-08 格式:PDF 页数:13 大小:159.43KB
返回 下载 相关 举报
PYTHON 3 初探 第 2 部分_第1页
第1页 / 共13页
PYTHON 3 初探 第 2 部分_第2页
第2页 / 共13页
PYTHON 3 初探 第 2 部分_第3页
第3页 / 共13页
PYTHON 3 初探 第 2 部分_第4页
第4页 / 共13页
PYTHON 3 初探 第 2 部分_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《PYTHON 3 初探 第 2 部分》由会员分享,可在线阅读,更多相关《PYTHON 3 初探 第 2 部分(13页珍藏版)》请在金锄头文库上搜索。

1、Python 3 初 探 , 第 2 部 分 : 高 级 主 题有 关 Python 版 本 3 , 也 即 Python 3000 或 Py3K 的 前 一篇 文 章 讨论 了 Python 内 打 破 向 后 兼 容 性 的 一些 基 本 变 化 , 比 如 新 的 print() 函数 、 bytes 数 据 类 型 以 及 string 类 型 的 变 化 。 本 文 是 该 系 列 文 章 的 第 2部 分 , 探 究 了 更 为 高 深 的 一些 主 题 , 比 如 抽 象 基 类 ( ABC) 、 元 类 、 函 数 注 释 和 修饰 符 ( decorator) 、 整 型 数

2、 ( integer literal) 支 持 、 数 值 类 型 层 次 结 构 以 及抛 出 和 捕 获 异 常 , 其 中 的 大 多 数 特 性 仍 然 会 打 破 与 版 本 2x 产 品 线 的 向 后 兼 容性 。 类 修 饰 符在 Python 之 前 的 版 本 中 , 对 方 法 的 转 换 必 须 在 方 法 定 义 之 后 进 行 。 对 于 较长 的 方 法 , 此 要 求 将 定 义 的 重 要 组 成 部 分 与 PythonEnhancementProposal(PEP)318( 有 关 链 接 , 请 参 见 参 考 资 料 ) 给 出 的 外 部 接 口 定

3、 义 分 离 。 下 面 的 代 码 片段 演 示 了 这 一转 换 要 求 :清 单 1. Python 3 之 前 版 本 中 的 方 法 转 化def myMethod(self):# do somethingmyMethod = transformMethod(myMethod)为 了 让 此 类 情 景 更 易 于 读 懂 , 也 为 了 避 免 必 须 多 次 重 用 相 同 的 方 法 名 , 在Python 版 本 2.4 中 引 入 了 方 法 修 饰 符 。修 饰 符 是 一些 方 法 , 这 些 方 法 可 以 修 改 其 他 方 法 并 返 回 一个 方 法 或 另 外

4、 一个 可 调 用 对 象 。 对 它 们 的 注 释 是 在 修 饰 符 的 名 称 前 冠 以 “ at” 符 号 ( ) 类似 Java 注 释 的 语 法 。 清 单 2 显 示 了 实 际 应 用 中 的 修 饰 符 。清 单 2. 一个 修 饰 符 方 法transformMethoddef myMethod(self):# do something修 饰 符 是 一些 纯 粹 的 语 法 糖 ( syntacticsugar) 或 者 ( 如 Wikipedia 所言 ) “ 对 计 算 机 语 言 语 法 的 补 充 , 这 些 补 充 并 不 影 响 语 言 的 功 能 ,

5、而 是 会 让 语 言变 得 更 易 于 被 人 使 用 。 ” 修 饰 符 的 一种 常 见 用 法 是 注 释 静 态 方 法 。 比 如 , 清 单 1和 清 单 2 相 当 , 但 清 单 2 更 容 易 被 人 读 懂 。定 义 修 饰 符 与 定 义 其 他 方 法 无 异 :def mod(method):method._name_ = Johnreturn methodmoddef modMe():passprint(modMe._name_)更 棒 的 是 Python 3 现 在 不 仅 支 持 针 对 方 法 的 修 饰 符 , 并 且 支 持 针 对 类 的 修饰 符

6、, 所 以 , 取 代 如 下 的 用 法 :class myClass:passmyClass = doSomethingOrNotWithClass(myClass)我 们 可 以 这 样 使 用 :doSomethingOrNotWithClassclass myClass:pass元 类元 类 是 这 样 一些 类 , 这 些 类 的 实 例 也 是 类 。 Python 3 保 留 了 内 置 的 、 用来 创 建 其 他 元 类 或 在 运 行 时 动 态 创 建 类 的 metaclass 类 型 。 如 下 的 语 法 仍 旧有 效 :aClass = type(classNa

7、me,(object,),magicMethod: lambda cls : print(blahblah)上 述 语 法 接 受 的 参 数 包 括 : 作 为 类 名 的 字 符 串 、 被 继 承 对 象 的 元 组 ( 可 以 是一个 空 的 元 组 ) 和 一个 包 含 可 以 添 加 的 方 法 的 字 典 ( 也 可 以 是 空 的 ) 。 当 然 , 也可 以 从 类 型 继 承 并 创 建 您 自 己 的 元 类 :class meta(type):def _new_(cls, className, baseClasses,dictOfMethods):return type

8、._new_(cls, className,baseClasses, dictOfMethods)只 允 许 关 键 字 的 参 数Python 3 已 经 更 改 了 函 数 参 数 分 配 给 “ 参 数 槽 ( parameter slot) ” 的方 式 , 可 以 在 传 递 进 的 参 数 内 使 用 星 号 ( *) 以 便 不 接 受 可 变 长 度 的 参 数 。 命 名的 参 数 必 须 在 * 之 后 比 如 , def meth(*, arg1): pass。 更 多 信 息 , 请 参考 Python 文 档 或 PEP 3102( 有 关 链 接 , 请 参 见 参

9、 考 资 料 ) 。注 意 : 如 果 上 面 两 个 例 子 起 不 到 任 何 作 用 , 我 强 烈 建 议 您 阅 读 David Mertz和 Michele Simionato 合 写 的 有 关 元 类 的 系 列 文 章 。 相 关 链 接 , 请 参 见 参 考资 料 。请 注 意 , 现 在 , 在 类 定 义 中 , 关 键 字 参 数 被 允 许 出 现 在 基 类 列 表 之 后 通常 来 讲 , 即 classFoo(*bases,*kwds):pass。 使 用 关 键 字 参 数 metaclass 将元 类 传 递 给 类 定 义 。 比 如 :class a

10、Class(baseClass1, baseClass2, metaclass= aMetaClass): pass旧 的 元 类 语 法 是 将 此 元 类 分 配 给 内 置 属 性 _metaclass_:class Test(object):_metaclass_ = type而 且 , 既 然 有 了 新 的 属 性 _prepare_ 我 们 就 可 以 使 用 此 属 性 为新 的 类 名 称 空 间 创 建 字 典 。 在 类 主 体 被 处 理 之 前 , 先 会 调 用 它 , 如 清 单 3 所 示 。清 单 3. 使 用 the _prepare_ attribute

11、的 一个 简 单 元 类def meth():print(Calling method)class MyMeta(type):classmethoddef _prepare_(cls, name, baseClasses):return meth:methdef _new_(cls, name, baseClasses,classdict):return type._new_(cls, name,baseClasses, classdict)class Test(metaclass = MyMeta):def _init_(self):passattr = an attributet = Te

12、st()print(t.attr)我 们 从 PEP 3115 节 选 了 一个 更 为 有 趣 的 例 子 , 如 清 单 4 所 示 , 这 个 例 子创 建 了 一个 具 有 其 方 法 名 称 列 表 的 元 类 , 而 同 时 又 保 持 了 类 方 法 声 明 的 顺 序 。清 单 4. 保 持 了 类 成 员 顺 序 的 一个 元 类# The custom dictionaryclass member_table(dict):def _init_(self):self.member_names = def _setitem_(self, key, value):# if the

13、 key is not already defined, add tothe # list of keys.if key not in self:self.member_names.append(key)# Call superclassdict._setitem_(self, key, value)# The metaclassclass OrderedClass(type):# The prepare functionclassmethoddef _prepare_(metacls, name, bases): # Nokeywords in this casereturn member_

14、table()# The metaclass invocationdef _new_(cls, name, bases, classdict):# Note that we replace the classdict witha regular # dict before passing it to the superclass,so that we # dont continue to record member namesafter the class# has been created.result = type._new_(cls, name, bases,dict(classdict

15、)result.member_names =classdict.member_namesreturn result在 元 类 内 所 做 的 这 些 改 变 有 几 个 原 因 。 对 象 的 方 法 一般 存 储 于 一个 字 典 , 而这 个 字 典 是 没 有 顺 序 的 。 不 过 , 在 某 些 情 况 下 , 若 能 保 持 所 声 明 的 类 成 员 的 顺 序将 非 常 有 用 。 这 可 以 通 过 让 此 元 类 在 信 息 仍 旧 可 用 时 , 较 早 地 涉 入 类 的 创 建 得 以实 现 这 很 有 用 , 比 如 在 C 结 构 的 创 建 中 。 借 助 这

16、种 新 的 机 制 还 能 在 将 来 实现 其 他 一些 有 趣 的 功 能 , 比 如 在 类 构 建 期 间 将 符 号 插 入 到 所 创 建 的 类 名 称 空 间 的主 体 以 及 对 符 号 的 前 向 引 用 。 PEP 3115 提 到 更 改 语 法 还 有 美 学 方 面 的 原 因 , 但是 对 此 尚 存 在 无 法 用 客 观 标 准 解 决 的 争 论 ( 到 PEP3115 的 链 接 , 请 参 见 参 考资 料 ) 。抽 象 基 类正 如 我 在 Python 3 初 探 , 第 1 部 分 : Python 3 的 新 特 性 中 提 到 的 ,ABC 是 一些 不 能 被 实 例 化 的 类 。 Java 或 C+ 语 言 的 程 序 员 应 该 对 此 概 念 十 分 熟悉 。 Python 3 添 加 了 一个 新 的 框 架

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号