1.魔法方法
在Python中,有些名称很特别,开头和结尾都是两个下划线。如__future__。这样的拼写表示名称有特殊意义,因此绝不要在程序中创建这样的名称。在这样的名称中,很大一部分都是魔法(特殊)方法的名称。如果你的对象实现了这些方法,它们将在特定情况下(具体是哪种情况取决于方法的名称)被Python调用,而几乎不需要直接调用。
这里讨论几个重要的魔法方法,其中最重要的是__init__以及一些处理元素访问的方法(它们让你能够创建序列或映射)。
如果你使用的不是 Python 3
在Python 2.2中,Python对象的工作方式有了很大的变化。这种变化带来了多个方面的影响。
这些影响对Python编程新手来说大都不重要,但有一点需要注意:即便你使用的是较新的Python 2版本,有些功能(如特性和函数super)也不适用于旧式类。要让你的类是新式的,要么在模块开头包含赋值语句__metaclass__ = type,要么直接或间接地继承内置类object或其他新式类。请看下面两个类:
class NewStyle(object):
more_code_here
class OldStyle:
more_code_here
在这两个类中,NewStyle是一个新式类,而OldStyle是一个旧式类。如果文件开头包含赋值语句__metaclass__ = type,这两个类都将是新式类。
也可在类的作用域内给变量__metaclass__赋值,但这样做只设置当前类的元类(metaclass)。元类是其他类所属的类,这是一个非常复杂的主题。
我并没有在所有示例中都显式地设置元类或继承object。然而,如果你的程序无需与旧版Python兼容,建议将所有类都定义为新式类。
请注意,在Python 3中没有旧式类,因此无需显式地继承object或将__metaclass__设置为type。所有的类都将隐式地继承object。如果没有指定超类,将直接继承它,否则将间接地继承它。
2.构造函数、析构函数
要介绍的第一个魔法方法是构造函数。你可能从未听说过构造函数(constructor),它其实就是一些示例中使用的初始化方法,只是命名为__init__。然而,构造函数不同于普通方法的地方在于,将在对象创建后自动调用它们。因此,无需采用一直使用的做法:
>>> f = FooBar()
>>> f.init()
构造函数让你只需像下面这样做:
>>>