Posted on 2005-10-11 17:01
任我行 阅读(831)
评论(0) 编辑 收藏 引用 所属分类:
Python
继续Dive Into Python.
20、定义类
以FileInfo类的定义为例
from UserDict import UserDict
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
1)父类放在类名后的小括号内;
2)类可以有文档字符串
3)__init__函数在对象被创建后被自动调用的第一个函数,可以指定任何个数的参数。
4)惯例,__init__应为类中第一个定义的方法,其第一个参数指向类的当前实例的第一个引用,且应命之为self。__init__中要显式地调用父类的__init__方法。
5)__init__无返回值。
6)__init__的定义是可选的,一旦定义必须显式调用父类的__init__方法。
7)除了可自由定义的普通的类方法,还有一些可以定义的专用方法。专用方法是在特殊情况下或当使用特别语法时由Python替你调用的,而不是在代码中直接调用(象普通的方法那样)。也就是说,python提供了一种方法,可以将非方法调用语法映射到方法调用上。最常见是__getitem__和__setitem__方法。例如,在上例中增加两个方法的定义,就可以实现方便的取值和赋值:
def __getitem__(self, key): return self.data[key]
def __setitem__(self, key, item): self.data[key] = item
>f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
>f[“name”]
>f[“anothername”]=...
8)__repr__专用函数,返回一个对象的字符串表示。Python用内置函数repr来显示变量的值,如果repr的参数是某个对象时,那用它的类的__repr__返回对象的字符串表示。
9)__cmp__专用函数,在比较类实例时被调用。即当作==比较时,被调用。
10)__len__专用函数,当调用内置函数len(instance)时被调用,对字符串返回字符的个数,对字典返回关键字的个数,对序列或列表返回元素个数。对自由定义的类,可自由定义返回的len的值的含义。:)
11)__delitem__专用函数, 在调用 del instance[key]被调用。
12)__setitem__,__getitem__,__cmp__,__len__,等方法加入到类的定义中后,可以使任何类看起来象“字典”。还有其它的一些专用方法,可以使类看起来象数值一样可以对它进行运行。
21、类的实例化和清除
1)象调用函数一样调用类,就可以实例化一个类,传入的参数是__init__定义的参数(参数是以从右向左的顺序传递给__init__的,python会自动添加self),返回一个实例对象。
2)一个类的所有实例,共享类的文档字符串,
3)python采用引用计数的技术进行垃圾回收,因而维护着对第一个创建的实例的引用的列表,当计数为0时,实例自动被破坏。
4)不用显式的释放一个实例,因为当变量超出作用域时自动失效,而至其所对应的实例的引用数减一。
5)在Python中,你不能子类化象字符串、列表和字典的内置数据类型。作为补偿,Python附带了封装类,可以模拟这些内置的数据类型的行为: UserString,UserList,和 UserDict。
6)子类中定义的方法覆盖父类的方法,python不支持函数重载。由此,子类的__init__与父类的__init__的参数序列可以有较大的不同。
7)python支持数据属性,即C++中所谓的“数据成员”,对其值的引用需要以"实例名.属性名"的方式。注意,数据属性是类实例拥有的属性,还有一种属性是叫属性,是类所拥有的
8)
22、当:号后面的块(即需要缩进的内容)只有一条语句时,可以直接将此语句放在:后面。