在Python中,有些名称很特别,开头和结尾都是两个下划线。你在本书前面已经见过一些,如__future__。这样的拼写表示名称有特殊意义,因此绝不要在程序中创建这样的名称。在这样的名称中,很大一部分都是魔法(特殊)方法的名称。如果你的对象实现了这些方法,它们将在特定情况下(具体是哪种情况取决于方法的名称)被Python调用,而几乎不需要直接调用。
本章讨论几个重要的魔法方法,其中最重要的是__init__以及一些处理元素访问的方法(它们让你能够创建序列或映射)。本章还将讨论两个相关的主题:特性(property)和迭代器(iterator)。前者以前是通过魔法方法处理的,但现在通过函数property处理,而后者使用魔法方法__iter__,这让其可用于for循环中。在本章最后,将通过一个内容丰富的示例演示如何使用已有知识来解
决非常棘手的问题。
9.1 如果你使用的不是 Python 3
在Python 2.2中, Python对象的工作方式有了很大的变化。这种变化带来了多个方面的影响。这些影响对Python编程新手来说大都不重要,但有一点需要注意:即便你使用的是较新的Python 2版本,有些功能(如特性和函数super)也不适用于旧式类。要让你的类是新式的,要么在模块开头包含赋值语句__metaclass__ = type(这在第7章提到过),要么直接或间接地继承内置类
object或其他新式类。请看下面两个类:
class NewStyle(object):
more_code_here
class OldStyle:
more_code_here
在这两个类中, NewStyle是一个新式类,而OldStyle是一个旧式类。如果文件开头包含赋值语句__metaclass__ = type,这两个类都将是新式类。
注意 也 可 在 类 的 作 用 域 内 给 变 量 __metaclass__ 赋 值 , 但 这 样 做 只 设 置 当 前 类 的 元 类(metaclass)。元类是其他类所属的类,这是一个非常复杂的主题
在本书中,我并没有在所有示例中都显式地设置元类或继承object。然而,如果你的程序无需与旧版Python兼容,建议将所有类都定义为新式类,并使用将在9.2.3节介绍的函数super等功能。
请注意,在Python 3中没有旧式类,因此无需显式地继承object或将__metaclass__设置为type。所有的类都将隐式地继承object。如果没有指定超类,将直接继承它,否则将间接地继承它。
领取专属 10元无门槛券
私享最新 技术干货