【Python】构造函数、析构函数与可变参数传递

在《【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__。

因此,程序的运行结果如下:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值