在《【Python】Windows版本的Python开发环境的配置,Helloworld,Python中文问题,输入输出、条件、循环、数组、类》(点击打开链接)虽然一定程度上介绍了Python中类的用法,然而并没有涉及到类中最重要的两个东西,一个是构造函数,另一个是析构函数。
构造函数的作用是保证每个对象的数据成员都有何时的初始值。
析构函数的作用是回收内存和资源,通常用于释放在构造函数或对象生命期内获取的资源。
python中的类有两个特殊方法,一个是“__init__”构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数。那么我们就可以把要先初始化的属性放到这个函数里面。另一个“__del__”就是析构函数了,当使用del 删除对象时,会调用他本身的析构函数,另外当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以用来释放内存空间。
如下的一个Python程序:
#-*-coding:utf-8-*-
class C:#注,python的self等于其它语言的this
name_list=[];
def __init__(self,*name_list):#name_list本质是一个数组
self.name_list=name_list;
print "构造函数执行";
def __del__(self):
print "析构函数执行";
def sayHello(self):
print "hello:",
for name in self.name_list:#然而,在类函数中,调用类成员,要指代类成员,不带这个self不行
print name,
print;
#主程序
c=C("呵呵","ssss",1);
c.sayHello();
主程序很简单,就新建类C的实例c,之后就调用其中的普通类函数sayHello。
在构造类C的实例c的时候,还用到Python的可变参数传递。
所谓的Python的可变参数传递是指:一般定义一个函数的时候,必须要预先定义这个函数需要多少个参数(或者说可以接受多少个参数),但是也有在定义函数的时候,不能知道参数个数的情况(想一想C语言里的printf函数),在Python里,带*的参数就是用来接受可变数量参数的。
用法与《【Java】JDK1.5以后新型的泛型参数传递方法Object...args》(点击打开链接)其实是一样的,如上的程序,构造类C的实例c的时候,传了3个程序给构造函数的*name_list接受,name_list本质是一个list容器,也就是可变长数组,之后利用类似this.x=x的形式给类成员的name_list[]赋值,将传过来的所有参数放入name_list[]里面。
之后在普通的sayHello方法,在python中需特定利用self.name_list[]来指代自己的类成员name_list[],否则,单写name_list[],python只能会找这个sayHello及其形式参数中的name_list[],不像其它语言会自动自己从整个类中找。
析构函数的话,在遇到类似del c或者其所在的作用域完成时python自己回收这个类时执行。在主函数没有del c,c所在的作用域在主函数中,因此整个python跑完之前释放c,在c释放之前执行其析构函数__del__。
因此,程序的运行结果如下: