基于Python构造方法与析构方法的研究
2019-10-09林观德
林观德
[摘 要] Python语言是一种使用非常广泛的面向对象的程序设计语言。构造方法和析构方法是Python语言面向对象程序设计非常重要的两个特殊方法。着重研究构造方法和析构方法的创建和调用及构造方法和析构方法的使用。研究证明:基于Python面向对象的程序设计语言,可以根据不同的应用需求建立适合自己需要的构造方法和析构方法,这有助于深刻理解类的构造方法用于新建对象的初始化工作与析构方法用于撤销对象,完成一些无用数据清理的工作。该研究对编程人员具有一定的指导意义。
[关 键 词] Python;构造方法;析构方法;self
[中图分类号] TP312 [文献标志码] A [文章编号] 2096-0603(2019)18-0128-02
一、引言
面向对象(Object Oriented)是当前程序设计关心的主题,它是软件开发方法的主流。在实际应用中,面向对象是通过类来实现面向对象编程的。使用面向对象编程时需要深刻理解面向对象的三大特性(封装、继承和多态)。这三大特性共同保证了程序的可扩展性需求。由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。在C语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。Python的作者有意地设计限制性很强的语法,通过强制程序员缩进,Python确实使程序更加清晰和美观。使不好的编程习惯都不能通过编译,因此Python已成为流行的面向对象的程序设计语言。本文主要对构造方法和析构方法的创建和调用展开研究。
二、构造方法与析构方法
类似于PHP的构造方法和析构方法并不需要显式的定义,实际上也是存在的。在实际开发中,也可以在类中显式地定义构造方法和析构方法。这样就可以在创建实例对象时,在构造方法里添加上代码完成对象的初始化工作;在对对象销毁时,在析构方法里添加一些代码释放对象占用的资源。他们只是在这个对象生成和销毁的时候才会被调用。Python提供两个非常特殊的方法:构造方法__init__()和析构方法__del__()。__init__()方法在创建实例对象的时候就会自动调用该方法,__del__()方法在销毁对象时就会自动调用该方法。
(一)构造方法的研究
構造方法是一种特殊的方法,是在类实例化为对象的时候最开始执行的方法,主要是用来在创建对象时初始化对象。创建好对象后,检查类中是否实现了构造器。如果类中没有实现
__init__()方法,就返回新创建的对象,而实例化操作也就结束了。如果实现了__init__()方法,就调用这个特殊方法,新创建的实例将作为它的第一个参数self被传递进去,整个过程就好像一个标准方法的调用一样,我们就可以把要预先初始化的属性放到这个方法里面。
下列代码是构造方法的典型例子。
class Car: #定义类
def __init__(self): #构造方法
self.color= "黑色"
print("构造方法被调用了")
def tool(self): #鸣笛
print("%s的车在鸣笛…"%(self.color))
car1=Car() #创建对象
car1.tool() #调用tool方法
运行上述程序输出如下结果:
"构造方法被调用了"
"黑色的车在鸣笛…"
研究结论:运行程序后,输出“构造方法被调用了”,说明在创建car1对象的过程中调用了_init__()构造方法。给Car类添加了color属性并赋值为“黑色”,在tool方法中访问了color属性的值。
上面研究的是没有带有参数的构造方法,下面通过实例来研究带有参数的构造方法,其代码如下:
class Car: #定义类
def __init__(self,color): #构造方法
self.color=color
print("构造方法被调用了")
def tool(self): #鸣笛
print("%s的车在鸣笛…"%(self.color))
car2=Car("红色") #创建对象
car2.tool() #调用tool方法
运行上述程序输出如下结果:
"构造方法被调用了"
"黑色的车在鸣笛…"
研究结论:运行程序后,输出“构造方法被调用了”,说明在创建car2对象的过程中调用了_init__()构造方法。本程序定义了带有参数的构造方法,并把参数值赋color属性,保证了color属性的值随参数接收到的值而变化,接着仍在tool方法中请问了color属性的值。
(二)析构方法的研究
在__init__()构造方法,当创建对象时,Python语言解释器默认调用了__init__()构造方法,当删除一个对象来释放类所占用资源时,Python语言解释器默认调用另外一个__del__(1)析构方法。
下列代码是析构方法的典型例子。
class Car: #定义类
def__init__(self,name,color): #构造方法
self.name=name
self.color=color
print(""构造方法被调用了"")
print(self.name,self.color)
def__del__(self): #析构方法
print("析构方法被调用了")
def tool(self): #鸣笛
print("%s%s的车在鸣笛…"%(self.color,self.name))
car3=Car("比来迪","红色") #创建对象
car3.tool()#调用tool方法
运行上述程序输出如下结果:
"构造方法被调用了"
"比来迪红色"
"红色比来迪的车在鸣笛…"
研究结论:运行程序后,输出“构造方法被调用了”,说明在创建car3对象的过程中调用了_init__()构造方法。本程序定义了带有参数的构造方法中,设置了name和color属性的初始值,在__del__()方法中增加了输出语句,然后使用了自定义构造方法创建了Car类的对象car3。运行程序时输出上述结果,从结果分析,本程序仍没有调用析构方法。
在上述程序的最后加上删除对象car3,输出结果又如何,其程序代码如下:
class Car: #定义类
def __init__(self,name,color): #构造方法
self.name=name
self.color=color
print("__init__")
print(self.name,self.color)
def __del__(self): #析构方法
print("析构方法被调用了")
def tool(self): #鸣笛
print("%s%s的车在鸣笛…"%(self.color,self.name))
car3=Car("比来迪","红色") #创建对象
car3.tool()#调用tool方法
del car3 # 删除对象
运行上述程序输出如下结果:
"构造方法被调用了"
"比来迪红色"
"红色比来迪的车在鸣笛…"
"析构方法被调用了"
研究结论:运行程序后,从结果分析,“构造方法被调用了”,当删除car3对象时也调用了析构方法,从而输出了“析构方法被调用了”。这样可以用来释放内存空间,对象释放后就不能再进行访问了。
(三)self的研究
self(相当于PHP,Java,C++中的this对象)代表类的实例对象,而非类本身。类的方法与普通的函数只有一个特殊的区别,在类的方法必须有个额外的第一个参数,这个参数名称是self。但在调用这个方法的时候不必为这个参数赋值。Python解释器会把这个对象作为第1个参数付给self,开发者只需要传递后面的参数就可以了。self代表当前对象的地址。
下面通过一个案例来研究self使用。
class Car: #定义类
def __init__(self,new_color): #构造方法
self.color=new_color
def print_color(self):
print("颜色为:%s"%self.color)
car_white=Car("白色")
car_white.print_color()
car_black=Car("黑色")
car_black.print_color()
運行上术程序输出如下结果:
"颜色为:白色"
"颜色为:黑色"
研究结论:在本例中定义了一个Car类,在__init__()方法中,通过参数设置color属性的初值,然后在print_color方法中获取了color的值。在程序的第6行,创建了一个Car类的对象car_white,设置属性的默认值为“白色”,并让car_white指向了该对象所指的内存地址。然后car_white调用了print_color方法,默认会把car_white引用的内在地址赋值给self,这时self也指向了这块内在地址,执行第5行输出语句会访问car_white的color属性的值,所以程序输出“白色”。同理,当car_black调用print_color方法,默认会把car_black引用的内在地址赋值给self,这时self也指向了这块内在地址,执行第5行输出语句会访问car_black的color属性的值,所以程序输出“黑色”。
三、结语
本文着重研究了Python语言类的定义、类的构造方法与析构方法相关概念及其多种的表达形式,根据不同的应用需求建立适合自己需要的构造方法和析构方法。继而进一步研究了不同形式的构造方法与析构方法的使用,并指出显式的调用构造方法与析构方法所带来的后果。这有助于学习者深刻理解Python的构造方法与析构方法,对学习Python语言的编程者提高Python编程能力有很大的参考价值。
参考文献:
[1]逄菲.基于Python的分布式网络爬虫系统的设计与实现[J].电子技术与软件工程,2018(23):25.
[2]狄博,王晓丹.基于Python语言的面向对象程序设计课程教学[J].计算机工程与科学,2014(S1).
[3]王明松,钱静媛.基于Python语言的面向对象课程实践教学探讨[J].电脑知识与技术,2017(4).
[4]谢克武.大数据环境下基于python的网络爬虫技术[J].电子制作,2017(9).
[5]贾棋然.基于Python专用型网络爬虫的设计及实现[J].电脑知识与技术,2017(12).
[6]赵英良.Python程序设计[M].北京:人民邮电出版社,2016.
[7]董付国.Python程序设计[M].北京:清华大学出版社,2016.
编辑 陈鲜艳