现在回到 super。如果使用了多重继承的层次结构,那么使用 super 是非常危险的, 主要原因在于类的初始化。在 Python 中,基类不会在__init__()中被隐式地调用,所以 需要由开发人员来调用它们。我们来看几个例子。 1.混用 super 与显式类调用 在下面来自 James Knight 网站(http://fuhm.net/super-harmful)的示例中,C 类使用 __
Python 装饰器的作用是使函数包装与方法包装(一个函数,接受函数并返回其增强函 数)变得更容易阅读和理解。最初的使用场景是在方法定义的开头能够将其定义为类方法 或静态方法。如果不用装饰器语法的话,定义可能会非常稀疏,并且不断重复: class WithoutDecorators: def some_static_method(): print("this is static method")
Jython 是 Python 语言的 Java 实现。它将代码编译为 Java 字节代码,开发人员在 Python 模块中可以无缝使用 Java 类。Jython 允许人们在复杂应用系统(例如 J2EE)中使用 Python 作为顶层脚本语言,它还将 Java 应用引入到 Python 世界中。Jython 的一个很好的例子就是, 在 Python 程序中可以使用 Apache Jackrabb
为了避免前面提到的所有问题,在 Python 在这个领域取得进展之前,我们需要考虑以 下几点。 • 应该避免多重继承:可以采用第 14 章介绍的一些设计模式来代替它。 • super 的使用必须一致:在类的层次结构中,要么全部用 super,要么全不用。 混用 super 和传统调用是一种混乱的做法。人们往往会避免使用 super,这样代 码会更清晰。 • 如果代码的使用范围包括 Python 2
在一种语言中,很难客观判断哪些语法元素属于高级语法。对于本章会讲到的高级语 法元素,我们会讲到这样的元素,它们不与任何特定的内置类型直接相关,而且在刚开始 学习时相对难以掌握。对于 Python 中难以理解的特性,其中最常见的是:• 迭代器(iterator)。 • 生成器(generator)。 • 装饰器(decorator)。 • 上下文管理器(context manager)。迭代器 迭
不存在适用于所有情况的最佳解决方案。一家公司认为好的解决方案可能并不适用于 其他团队的工作流程。而且每个应用的需求也各不相同。小项目可以只使用 virtualenv 或 venv,比较简单,但大型项目可能还需要 buildout 的帮助,以便进行更复杂的装配。 之前没有详细说明的是,在 buildout 早期版本(2.0.0 版之前)中,可以在隔离环境中 对项目进行装配,其结果与 Virtuale
针对软件设计的常见问题,设计模式是可复用的且有点语言相关的解决方案。关于这个主 题的最流行的书是 Design Patterns: Elements of Reusable Object-Oriented Software,这本书由 Gamma、Helm、Johnson 和 Vlissides 编写,它们也被称为四人组(Gang of Four)或 GoF。这 本书是这个领域中的重要著作,它收录了
老实说,多线程是很有挑战性的-我们已经在上一节中看到了。事实上,对问题的最简 单的方法是只需要最小的代价。但是以一种安全的方式处理线程需要大量的代码。 我们必须设置线程池和通信队列,优雅地处理来自线程的异常,并且在尝试提供速率 限制功能时也考虑线程安全。十行代码只能从外部库并行执行一个函数!我们假设它可以 用于生产环境,因为有外部包创建者的承诺,它的库是线程安全的。听起来像一个高价格 的解决方案,
正如我前面所说,与第三方程序(如数据库、缓存、Web 服务或 LDAP 服务器)通信的应用程序可能会在这些应用程序运行缓慢时放慢速度。在应用程序端使用常规代码分析 方法可以进行跟踪。但是,如果第三方软件自己工作正常,那么罪魁祸首可能是网络。 问题可能是配置错误的集线器,低带宽网络链路,或甚至是大量的使计算机多次发送 相同的数据包的流量冲突。 这里有几个元素,你应该收集一下。要了解发生了什么,首先要
代码覆盖率(code coverage)是一个非常有用的度量标准,它提供了有关项目代码的 测试的客观信息。它仅仅是在所有测试执行期间执行多少和哪些代码行的测量。它通常表示为百分比,100%覆盖意味着每个代码行都在测试期间执行。 最流行的代码覆盖工具被称为 simply coverage,并在 PyPI 上免费提供。使用非 常简单,只包括两个步骤。第一步是在 shell 中运行 coverage r
当你需要呈现一些代码示例时,可以使用文字块。两个冒号用于标记代码块,代码块 需要进行缩进,如下所示: This is a code example :: >>> 1 + 1 2 Let's continue our text 请注意,冒号字符可以放在文本行中。在这种情况下,它将被渲染为单个冒号(运行 结果参见图 9-3): This is a code exa
暂时先忘了集中式版本控制系统。 说实话。集中式版本控制系统是过去的残遗物。在大多数人有机会远程全职工作的时 候,就会受到集中式 VCS 的所有缺陷的约束。例如,对于 CVS 或 SVN,你不能在离线时 跟踪更改。这是愚蠢的。当你的工作场所的 Internet 连接暂时中断或中央存仓库关闭时,你 应该怎么办?你应该忘记所有的工作流程,只是允许堆积更改,直到恢复正常,然后只是 把它
如前所述,编写扩展不是一个简单的任务,你需要付出很多努力的工作,同时,它也 可以给你带来很多的优势。使用诸如 Cython 或 Pyrex 之类的工具,或者使用 ctypes 或 cffi 简单地与现有的动态库集成,通过这些方法开发自己的扩展是最简单的,也是值得 推荐的方法。这些项目会极大的提高你的开发效率,并且降低代码的开发难度,使代码具 有更好的可读性与可维护性。 总之,如果你是新了解这个话题
在介绍 Python 代码打包的材料中,创建独立可执行文件是经常被忽略的一个主题。这 主要是因为 Python 标准库中缺少合适的工具能够让程序员创建简单的可执行文件,用户不 需要安装 Python 解释器就可以运行这些可执行文件。 与 Python 相比,编译语言有一个很大的优点,就是它允许为给定的系统架构创建可执 行的应用程序,用户不需要知道底层技术就可以运行。Python 代码作为一个包分发
函数和方法的签名是代码完整性的保证,它们驱动函数和方法的使用并构建其 API。除 了我们之前看到的命名规则之外,对参数也要特别小心。这可以通过 3 个简单的规则来实现。 • 通过迭代设计构建参数。 • 信任参数和测试。 • 小心使用魔法参数*args 和**kwargs。通过迭代设计构建参数 如果每个函数都有一个固定的、定义明确的参数列表,那么代码的鲁棒性会更好。但 这在第一个版本中无法完成,所
一组常用的命名规则可以被应用于变量、方法、函数和 property。类和模块的名称 也在命名空间的构建中具有重要的作用,从而也影响代码可读性。本迷你指南为挑选名称 提供了常见的模式和反模式。用“has”或“is”前缀命名布尔元素 如果一个元素保存的是布尔值,is 和 has 前缀提供一种自然的方式,使其在命名空 间中的可读性更强,代码如下: class DB: is_connected =
Python 语法中有一些元素不太常见,也很少用到。这是因为它们能提供的好处很少, 或者它们的用法很难记住。因此,许多 Python 程序员(即使有多年的经验)完全不知道这 些语法元素的存在。其中最有名的例子如下: • for ... else 语句。 • 函数注解(function annotation)。for...else...语句 在 for 循环之后使用 else 子句,可以在循环“自
在一种语言中,很难客观判断哪些语法元素属于高级语法。对于本章会讲到的高级语 法元素,我们会讲到这样的元素,它们不与任何特定的内置类型直接相关,而且在刚开始 学习时相对难以掌握。对于 Python 中难以理解的特性,其中最常见的是:• 迭代器(iterator)。 • 生成器(generator)。 • 装饰器(decorator)。 • 上下文管理器(context manager)。 迭代器
前面已经说过,Python 3 打破了对 Python 2 的向后兼容。但它并不是完全重新设计的。 而且,也并不是说 2.x 版本的 Python 模块在 Python 3 下都无法运行。代码可以完全跨版本兼 容,无需其他工具或技术在两大版本上都可以运行,但一般只有简单应用才能做到这一点。为什么要关注这些差异 本章前面说过我个人对 Python 2 兼容性的看法,但是目前不可能完全忽视这一点。还
通常,开发人员认为线程是一个复杂的主题。虽然这个说法是完全正确的,然而 Python 提供了一些高级类和函数,通过它们可以轻松地使用线程。CPython 的线程实现中带有一些麻 烦的细节,使得它们没其他语言那么实用。对于你可能想要解决的一些特定的问题,它们仍然 是完全正确的,但是它们不和 C 或 Java 一样解决同样多的问题。在本节中,我们将讨论 CPython 中多线程的局限性,以及使用 Py
既然我们已经知道如何正确地打包,编译和安装自定义 C 扩展,并且确信它能按照预 期正常地工作,现在是时候来详细讨论一下我们的代码。扩展模块以一个包含 Python.h 头文件的单独的 C 预处理器指令开始,代码如下: #include <Python.h>它把整个 Python/C API 以及编写扩展需要引入的一切包含进来。在更现实的开发中, 你的代码可能需要更多的预处理器指令,这样
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号