林觀德
[摘 ? ? ? ? ? 要] ?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.
編輯 陳鮮艷