首页 > 深入Python > 面向对象框架 > 定义类 | << >> | ||||
diveintopython.org Python for experienced programmers |
Python是完全面向对象的:可以定义自已的类,从自已的或内置类进行继承,然后对生成的类进行实例化。
在Python中定义类很简单;就象定义函数,没有分离的定义接口。只要定义类,然后开始编码就可以了。Python类以保留字 class 开始,跟着是类的名字。从技术上说,有这些就足够了,因为一个类不需要从任何其它类继承而来。
class foo: pass
在Python中的 pass 语句象Java或C中的大括号空集({})。 |
当然,实际上大多数的类将从其它的类继承来的,并且它们将定义自已的类方法和属性。但是如你所见,除了名字以外,没有什么东西是一个类必须拥有的。特别是,C++程序员可能会感到奇怪,Python的类没有明确的构造器和析构器。Python类的确存在同一个构造器相似的东西: __init__ 方法。
from UserDict import UserDict class FileInfo(UserDict):
在Python中,类的祖先被简单地列在立即跟在类名字后面的小括号里。不象在Java中有象 extends 一样的关键字。 |
Python支持多重继承,但我不想在本书中更深地对其进行讨论。在类名后面跟着的小括号中,你可以按你的喜好列出尽可能多的类名,类名以逗号分隔。 |
class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None):
类也可以(也应该)有文档字符串,就象模块和函数。 | |
__init__ 在类的实例创建后立即被调用。它可能会诱使你,但是不正确地,叫它为类的构造器。说它诱使,是因为它看上去象构造器(按照习惯, __init__ 是类中第一个定义的方法),象构造器一样动作(在一个新创建的类实例中,它是首先被执行的代码),并且听起来也象构造器(“init”当然意味着构造的本性)。说它不正确,是因为对象在 __init__ 被调用的时刻已经被构造出来了,你已经有了对类的新实例一个有效的引用。但 __init__ 是在Python中你可以得到的最接近一个构造器的东西,并且它也扮演着非常相似的角色。 |
|
每一个类方法的第一个参数,包括 __init__,总是指向类的当前实例的一个引用。按照习惯这个参数被命名为 self。在 __init__ 方法中,self 指向新创建的对象;在其它的类方法中,它指向方法被调用的类实例。尽管当定义方法时你需要明确指定 self,但当调用方法时,你不用指定 self。Python会替你自动加上的。 | |
__init__ 方法可以接受任意个数的参数,就象函数一样,参数可以用缺省值定义,可以设置成对于调用者可选。在本例中, filename 有一个缺省值 None,即Python的空值。 |
习惯上,任何类方法的第一个参数(对当前实例的引用)叫做 self。这个参数扮演着在C++或Java中保留字 this 的角色,但 self 在Python中不是保留字,只是一个命名习惯。虽然如此,除了叫为 self 外请不要叫为别的东西,这是一个非常强烈的习惯。 |
class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None): UserDict.__init__(self) self["name"] = filename
当定义你自已的类方法时,你必须明确将 self 作为每个方法的第一个参数列出,包括 __init__。当从你的类中调用一个父类的一个方法时,你必须包括 self 参数。但当你从类的外部调用你的类方法时,你不必对 self 指明任何东西;你完全将其忽略,而Python会自动地替你增加实例的引用。我知道刚开始这有些混乱,它并不是真正矛盾的,因为它依靠于一个你还不了解的区别(在绑定与非绑定方法之间),故看上去是矛盾的。 |
噢。我知道有很多知识需要吸收,但是你要掌握它。所有的Python类以相同的方式工作,所以一旦你学会了一个,就是学会了全部。再加上,在Python社区中有强烈的习惯,对于每个类方法的第一个参数都命名为“self”,所以你不会浪费大量时间去习惯他人的风格。如果你忘了别的任何事,也要记住这件事,因为我认定它会让你出错:
__init__ 方法是可选的,但是一旦你定义了一个,就必须记得显示调用父类的 __init__ 方法。这样更是正确的:何时一个子类想扩展父类的行为,后代方法必须在适当的时机,使用适当的参数,显式调用父类方法。 |
进一步阅读
使用 from module import 导入模块 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
实例化类 |