
淺談python中的面向對象和類的基本語法
當我發現要寫python的面向對象的時候,我是躊躇滿面,坐立不安呀。我一直在想:這個坑應該怎么爬?因為python中關于面向對象的內容很多,如果要講透,最好是用面向對象的思想重新學一遍前面的內容。這個坑是如此之大,猶豫再三,還是只撿一下重要的內容來講吧,不足的內容只能靠大家自己去補充了。
慣例聲明一下,我使用的版本是 python2.7,版本之間可能存在差異。
好,在開講之前,我們先思考一個問題,看代碼:
為什么我只創建是為 a 賦值,就可以使用一些我沒寫過的方法?
可能會有小伙伴說:因為 a 此時是個字符串對象呀,當然能夠使用字符串的方法,至于這些方法,那是python事先寫好的。
好吧,那換個問題,為什么 python 知道它是個字符串對象?
在深入講這個問題之前,先記住一句話:python中一切皆對象,對象都是由類創建的。
那么類是什么東西呢?我在這舉個例子。
有一天,我在街上走著,突然看見前面有一個仇人。此時我想揍他一頓,但是力是相互作用的呀,打他我的拳頭也會疼。誒,此時我發現路邊有個石頭,大小形狀正合適,在不考慮警察叔叔怎么想的前提下,這是一個好的選擇。然后我抄起石頭,對著仇人進行了一些好孩子不能模仿的行為,然后深藏功與名,收工回家。
在這個過程中,我們為什么會知道那塊東西是石頭?
因為它的具有石頭的外觀特征呀!
為什么我們會知道石頭可以砸人?
因為石頭硬呀!
為什么我們知道石頭是硬的?
因為......嗯.....小時候我爸告訴我的。
此時可以得到一個結論:我們知道一個東西是什么,具有什么功能,是因為我們的腦海中已經有個這個東西的概念。而這個概念可能是從長輩那里知道的,也可能是自己各種實驗后自己總結的。類似于我們對于‘黑洞'這個東西的認識,還是科學家的各種研究總結而來。
如何將用石頭打人這個例子用代碼來實現的話:
class Stone(object): # 我創建一個叫Stone的類
def attack(self):
print '把頭伸過來,我給你加個buff'
a = Stone() # 我用類創建了一個對象,也稱為類的實例化
a.attack() # 我使用這個對象的方法
很好,這樣我們就完成了我們的需要了。
如果我們再創建其他對象:
很顯然python并沒有為我們準備 attack 方法,所以就用不了。
所謂的類只是一個抽象的定義,而實例則是具體的對象。它們之間的差別就想我腦海中的石頭和我手中的石頭一樣,只有后者才真實存在。當然,這里不要跟我講什么唯心主義論什么的。
看到這里,關于類和對象之間的關系應該清楚了一些。有些同學可能會問:python中的類都是我們事先寫好的,有沒有方法讓python自動生成類,然后在特定的時候使用這些類呢?恭喜你,同學,你可能摸到了人工智能的門檻了,如果能夠實現的話,那和我們人類的學習能力不是差不多嗎?好吧,這只是我的一個設想,真正的人工智能要怎么實現,我也不知道,還沒有這么高的水平去研究先,不過作為一名程序員,能夠編寫人工智能,可能是終身的追求了吧。
在講完類和實例化是怎么一回事之后,我們來看看類的基本語法。
首先,和定義函數的 def 一樣, class 是定義類的關鍵字。
緊接著的是類名,這個可以自定義,同樣的,不能和python的內置關鍵字沖突。另外,建議避開python的內建類型,例如 str、int之類的名字。規范的命名應該遵從“駝峰命名法”,例如: MyClass 這里的命名,每個單詞的首字母大寫。
然后是一個括號,里面的參數是用于繼承的,一般繼承于 object,表示一個新式類。另外,你可能見過沒有括號的寫法,這是經典類的寫法。
示例:
class NewClass(object):
pass
class OldClass:
pass
New = NewClass() # 創建一個新式類的實例
Old = OldClass() # 創建一個經典類的實例
這就是類的基本語法,當然這樣還是不夠的,但是在更深入之前,我想先講一個新舊式類的差別。
在這里,我們先打印一下兩個變量的類型:
print type(New)
print type(Old)
可以看下兩者的輸出是不同的。
在早于python2.2的版本時,只有經典類這一種寫法,當時,類和類型沒有合并。
類是類對象,實例是實例對象,這兩個對象之間沒有任何關系。
這句話是什么意思?看代碼:
print type(OldClass)
print type(Old)
我們可以看見其輸出很含糊,經典類屬于類對象,無論是哪個類,都統一為“類”類型,實例屬于實例類型,卻不知道其是由哪個類創建的,所以的實例都統一為“實例”類型。也就是說當時的類型用 classobj 和 instance 代表了所以的類和實例,無論你是哪個類,又或是哪個類創建的實例。
這樣的信息實在太少,而類和類型之間非?;靵y。為了解決這種情況,在 python2.2 中引入了新式類,并進行了類和類型的同統一。
print type(NewClass)
print type(New)
類的類型是 type?type 返回的對象還能像類一樣創新新對象?
總結的來說:在新式類中,所以的類對象都是 type 的實例。而不同的類對象有能創建出其對應的實例。
class NewClass(object):
def __init__(self, val):
self.val = val
New = NewClass(123)
b = type(New)(321) # 對實例來說type返回的是類對象,我又可以用類對象來和創建新的實例
print b.val
構造器方法
一般可以理解類中的函數就是方法,而方法分為:實例方法,只有實例化后才能調用的,其第一個參數一般為 self,代表實例本身;類方法,其第一個參數為 cls,代表類本身;還有靜態方法,就是個普通函數,沒有要求參數。
1. __init__(self [,arg1,....]):
當類被調用進行實例化的時候,python會自動調用類里面的構造函數(如果有的話),在構造函數中,可以進行各種初始化的操作,最常見的就是上面的進行實例的屬性的創建。
python 在示例化的時候,會檢查其實行了 __init__ 方法了沒有,如果沒有則不對實例進行任何操作,然后返回對象。如果實行了這個方法,則自動調用這個方法,并自動將 self 傳進行,也就是說我們在實例化進行傳參的時候,將不用理會 self,直接傳給后面的參數。
講到屬性,就必須要提一下什么是屬性。屬性這個對象其實更像一個變量,大多數對象都可以有屬性(不包括python的內置類型),例如函數。
def Test():
pass
Test.a = 123
print Test.a
因為函數也是一個對象。
屬性在類中,就是一個變量,例如:
class NewClass(object):
a = 123
print NewClass.a
當然,因為 python 的特性,我們可以在運作中為某個對象添加屬性,而不用一開始就在類中寫定。
注意,這個方法應該返回 None,也就是說我們一般不用 return 任何對象,讓它默認返回就行了。
2. __new__(cls [,arg1,....]):
這也是一個構造器方法,它是一個類方法,一般在對 python 的不可變數據類型進行繼承擴展的時候用的比較多。
某處拿來的代碼示例:
class RoundFloat(float):
def __new__(cls, val):
return super(RoundFloat, cls).__new__(cls, round(val, 2))
a = RoundFloat(3.14159)
print a
解構器方法
__del__(self [,arg1,....])
這個方法將會在對象所以的引用被清除后才執行,例如:
class Test(object):
def __del__(self):
print '我被干掉了,兄弟們為我報仇!'
a = Test() # 創建了一個對象
b = a # b又引用了a
c = b # c又引用了b,現在 a 所指向的對象有3次引用,相當有三條命
del a # 干掉一條命
del b # 又干掉
del c # 聽說你有3條命?全部干掉!
注意,這里只輸出了一次,也就是說到了最后才刪除完畢。這里要注意一下幾點:
1.調用 del 并不意味著完成刪除某個對象,只是減少引用。
2.如果你有一個循環引用或其它的原因,讓一個實例的引用逗留不去,該對象的__del__()可能永遠不會被執行。
3.__del__()未捕獲的異常會被忽略掉(因為一些在__del__()用到的變量或許已經被刪除了)。 不要在__del__()中干與實例沒任何關系的事情。
4.一般情況下并不用實現這個方法,因為這樣有一定的風險。
5.如果你定義了__del__,并且實例是某個循環的一部分,垃圾回收器將不會終止這個循環— —你需要自已顯式調用 del。
6.如果繼承了父類,且父類中也有解構器,要記得調用。否則可能會有某些在父類中的清理方法沒有調用到,出現以下無法預料的錯誤。
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25