欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談python中的面向?qū)ο蠛皖惖幕菊Z法

 更新時(shí)間:2016年06月13日 10:48:47   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談python中的面向?qū)ο蠛皖惖幕菊Z法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

當(dāng)我發(fā)現(xiàn)要寫python的面向?qū)ο蟮臅r(shí)候,我是躊躇滿面,坐立不安呀。我一直在想:這個(gè)坑應(yīng)該怎么爬?因?yàn)閜ython中關(guān)于面向?qū)ο蟮膬?nèi)容很多,如果要講透,最好是用面向?qū)ο蟮乃枷胫匦聦W(xué)一遍前面的內(nèi)容。這個(gè)坑是如此之大,猶豫再三,還是只撿一下重要的內(nèi)容來講吧,不足的內(nèi)容只能靠大家自己去補(bǔ)充了。

慣例聲明一下,我使用的版本是 python2.7,版本之間可能存在差異。

好,在開講之前,我們先思考一個(gè)問題,看代碼:

為什么我只創(chuàng)建是為 a 賦值,就可以使用一些我沒寫過的方法?

可能會有小伙伴說:因?yàn)?a 此時(shí)是個(gè)字符串對象呀,當(dāng)然能夠使用字符串的方法,至于這些方法,那是python事先寫好的。

好吧,那換個(gè)問題,為什么 python 知道它是個(gè)字符串對象?

在深入講這個(gè)問題之前,先記住一句話:python中一切皆對象,對象都是由類創(chuàng)建的。

那么類是什么東西呢?我在這舉個(gè)例子。

有一天,我在街上走著,突然看見前面有一個(gè)仇人。此時(shí)我想揍他一頓,但是力是相互作用的呀,打他我的拳頭也會疼。誒,此時(shí)我發(fā)現(xiàn)路邊有個(gè)石頭,大小形狀正合適,在不考慮警察叔叔怎么想的前提下,這是一個(gè)好的選擇。然后我抄起石頭,對著仇人進(jìn)行了一些好孩子不能模仿的行為,然后深藏功與名,收工回家。

在這個(gè)過程中,我們?yōu)槭裁磿滥菈K東西是石頭?

因?yàn)樗木哂惺^的外觀特征呀!

為什么我們會知道石頭可以砸人?

因?yàn)槭^硬呀!

為什么我們知道石頭是硬的?

因?yàn)?.....嗯.....小時(shí)候我爸告訴我的。

此時(shí)可以得到一個(gè)結(jié)論:我們知道一個(gè)東西是什么,具有什么功能,是因?yàn)槲覀兊哪X海中已經(jīng)有個(gè)這個(gè)東西的概念。而這個(gè)概念可能是從長輩那里知道的,也可能是自己各種實(shí)驗(yàn)后自己總結(jié)的。類似于我們對于‘黑洞'這個(gè)東西的認(rèn)識,還是科學(xué)家的各種研究總結(jié)而來。

如何將用石頭打人這個(gè)例子用代碼來實(shí)現(xiàn)的話:

class Stone(object):  # 我創(chuàng)建一個(gè)叫Stone的類

  def attack(self):
    print '把頭伸過來,我給你加個(gè)buff'

a = Stone()  # 我用類創(chuàng)建了一個(gè)對象,也稱為類的實(shí)例化
a.attack()   # 我使用這個(gè)對象的方法

很好,這樣我們就完成了我們的需要了。

如果我們再創(chuàng)建其他對象:

很顯然python并沒有為我們準(zhǔn)備 attack 方法,所以就用不了。

所謂的類只是一個(gè)抽象的定義,而實(shí)例則是具體的對象。它們之間的差別就想我腦海中的石頭和我手中的石頭一樣,只有后者才真實(shí)存在。當(dāng)然,這里不要跟我講什么唯心主義論什么的。

看到這里,關(guān)于類和對象之間的關(guān)系應(yīng)該清楚了一些。有些同學(xué)可能會問:python中的類都是我們事先寫好的,有沒有方法讓python自動生成類,然后在特定的時(shí)候使用這些類呢?恭喜你,同學(xué),你可能摸到了人工智能的門檻了,如果能夠?qū)崿F(xiàn)的話,那和我們?nèi)祟惖膶W(xué)習(xí)能力不是差不多嗎?好吧,這只是我的一個(gè)設(shè)想,真正的人工智能要怎么實(shí)現(xiàn),我也不知道,還沒有這么高的水平去研究先,不過作為一名程序員,能夠編寫人工智能,可能是終身的追求了吧。

在講完類和實(shí)例化是怎么一回事之后,我們來看看類的基本語法。

首先,和定義函數(shù)的 def 一樣, class 是定義類的關(guān)鍵字。

緊接著的是類名,這個(gè)可以自定義,同樣的,不能和python的內(nèi)置關(guān)鍵字沖突。另外,建議避開python的內(nèi)建類型,例如 str、int之類的名字。規(guī)范的命名應(yīng)該遵從“駝峰命名法”,例如: MyClass 這里的命名,每個(gè)單詞的首字母大寫。

然后是一個(gè)括號,里面的參數(shù)是用于繼承的,一般繼承于 object,表示一個(gè)新式類。另外,你可能見過沒有括號的寫法,這是經(jīng)典類的寫法。

示例:

class NewClass(object):
  pass

class OldClass:
  pass

New = NewClass()  # 創(chuàng)建一個(gè)新式類的實(shí)例
Old = OldClass()  # 創(chuàng)建一個(gè)經(jīng)典類的實(shí)例

這就是類的基本語法,當(dāng)然這樣還是不夠的,但是在更深入之前,我想先講一個(gè)新舊式類的差別。

在這里,我們先打印一下兩個(gè)變量的類型:

print type(New)
print type(Old)

可以看下兩者的輸出是不同的。

在早于python2.2的版本時(shí),只有經(jīng)典類這一種寫法,當(dāng)時(shí),類和類型沒有合并。

類是類對象,實(shí)例是實(shí)例對象,這兩個(gè)對象之間沒有任何關(guān)系。

這句話是什么意思?看代碼:

print type(OldClass)
print type(Old)

我們可以看見其輸出很含糊,經(jīng)典類屬于類對象,無論是哪個(gè)類,都統(tǒng)一為“類”類型,實(shí)例屬于實(shí)例類型,卻不知道其是由哪個(gè)類創(chuàng)建的,所以的實(shí)例都統(tǒng)一為“實(shí)例”類型。也就是說當(dāng)時(shí)的類型用 classobj 和 instance 代表了所以的類和實(shí)例,無論你是哪個(gè)類,又或是哪個(gè)類創(chuàng)建的實(shí)例。

這樣的信息實(shí)在太少,而類和類型之間非常混亂。為了解決這種情況,在 python2.2 中引入了新式類,并進(jìn)行了類和類型的同統(tǒng)一。

print type(NewClass)
print type(New)

類的類型是 type?type 返回的對象還能像類一樣創(chuàng)新新對象?

總結(jié)的來說:在新式類中,所以的類對象都是 type 的實(shí)例。而不同的類對象有能創(chuàng)建出其對應(yīng)的實(shí)例。

class NewClass(object):
  def __init__(self, val):
    self.val = val

New = NewClass(123)  
b = type(New)(321) # 對實(shí)例來說type返回的是類對象,我又可以用類對象來和創(chuàng)建新的實(shí)例
print b.val

構(gòu)造器方法

一般可以理解類中的函數(shù)就是方法,而方法分為:實(shí)例方法,只有實(shí)例化后才能調(diào)用的,其第一個(gè)參數(shù)一般為 self,代表實(shí)例本身;類方法,其第一個(gè)參數(shù)為 cls,代表類本身;還有靜態(tài)方法,就是個(gè)普通函數(shù),沒有要求參數(shù)。

1. __init__(self [,arg1,....]):

當(dāng)類被調(diào)用進(jìn)行實(shí)例化的時(shí)候,python會自動調(diào)用類里面的構(gòu)造函數(shù)(如果有的話),在構(gòu)造函數(shù)中,可以進(jìn)行各種初始化的操作,最常見的就是上面的進(jìn)行實(shí)例的屬性的創(chuàng)建。

python 在示例化的時(shí)候,會檢查其實(shí)行了 __init__ 方法了沒有,如果沒有則不對實(shí)例進(jìn)行任何操作,然后返回對象。如果實(shí)行了這個(gè)方法,則自動調(diào)用這個(gè)方法,并自動將 self 傳進(jìn)行,也就是說我們在實(shí)例化進(jìn)行傳參的時(shí)候,將不用理會 self,直接傳給后面的參數(shù)。

講到屬性,就必須要提一下什么是屬性。屬性這個(gè)對象其實(shí)更像一個(gè)變量,大多數(shù)對象都可以有屬性(不包括python的內(nèi)置類型),例如函數(shù)。

def Test():
  pass

Test.a = 123
print Test.a

因?yàn)楹瘮?shù)也是一個(gè)對象。

屬性在類中,就是一個(gè)變量,例如:

class NewClass(object):
  a = 123

print NewClass.a

當(dāng)然,因?yàn)?python 的特性,我們可以在運(yùn)作中為某個(gè)對象添加屬性,而不用一開始就在類中寫定。

注意,這個(gè)方法應(yīng)該返回 None,也就是說我們一般不用 return 任何對象,讓它默認(rèn)返回就行了。

2. __new__(cls [,arg1,....]):

這也是一個(gè)構(gòu)造器方法,它是一個(gè)類方法,一般在對 python 的不可變數(shù)據(jù)類型進(jìn)行繼承擴(kuò)展的時(shí)候用的比較多。

某處拿來的代碼示例:

class RoundFloat(float):
  def __new__(cls, val):
    return super(RoundFloat, cls).__new__(cls, round(val, 2))

a = RoundFloat(3.14159)
print a

解構(gòu)器方法

__del__(self [,arg1,....])

這個(gè)方法將會在對象所以的引用被清除后才執(zhí)行,例如:

class Test(object):

  def __del__(self):
    print '我被干掉了,兄弟們?yōu)槲覉?bào)仇!'

a = Test() # 創(chuàng)建了一個(gè)對象
b = a  # b又引用了a
c = b  # c又引用了b,現(xiàn)在 a 所指向的對象有3次引用,相當(dāng)有三條命
del a  # 干掉一條命
del b  # 又干掉
del c  # 聽說你有3條命?全部干掉!

注意,這里只輸出了一次,也就是說到了最后才刪除完畢。這里要注意一下幾點(diǎn):

1.調(diào)用 del 并不意味著完成刪除某個(gè)對象,只是減少引用。

2.如果你有一個(gè)循環(huán)引用或其它的原因,讓一個(gè)實(shí)例的引用逗留不去,該對象的__del__()可能永遠(yuǎn)不會被執(zhí)行。

3.__del__()未捕獲的異常會被忽略掉(因?yàn)橐恍┰赺_del__()用到的變量或許已經(jīng)被刪除了)。 不要在__del__()中干與實(shí)例沒任何關(guān)系的事情。

4.一般情況下并不用實(shí)現(xiàn)這個(gè)方法,因?yàn)檫@樣有一定的風(fēng)險(xiǎn)。

5.如果你定義了__del__,并且實(shí)例是某個(gè)循環(huán)的一部分,垃圾回收器將不會終止這個(gè)循環(huán)— —你需要自已顯式調(diào)用 del。

6.如果繼承了父類,且父類中也有解構(gòu)器,要記得調(diào)用。否則可能會有某些在父類中的清理方法沒有調(diào)用到,出現(xiàn)以下無法預(yù)料的錯(cuò)誤。

以上這篇淺談python中的面向?qū)ο蠛皖惖幕菊Z法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyCharm使用技巧之設(shè)置背景圖片方式

    PyCharm使用技巧之設(shè)置背景圖片方式

    這篇文章主要介紹了PyCharm使用技巧之設(shè)置背景圖片方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • python查看zip包中文件及大小的方法

    python查看zip包中文件及大小的方法

    這篇文章主要介紹了python查看zip包中文件及大小的方法,實(shí)例分析了Python基于zipfile模塊操作zip壓縮文件的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下
    2015-07-07
  • Python裝飾器基礎(chǔ)概念與用法詳解

    Python裝飾器基礎(chǔ)概念與用法詳解

    這篇文章主要介紹了Python裝飾器基礎(chǔ)概念與用法,結(jié)合實(shí)例形式詳細(xì)分析了Python裝飾器的概念、功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • 在cmder下安裝ipython以及環(huán)境的搭建

    在cmder下安裝ipython以及環(huán)境的搭建

    今天小編就為大家分享一篇關(guān)于在cmder下安裝ipython以及環(huán)境的搭建,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Django配置kafka消息隊(duì)列的實(shí)現(xiàn)

    Django配置kafka消息隊(duì)列的實(shí)現(xiàn)

    本文主要介紹了Django配置kafka消息隊(duì)列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 在Python web中實(shí)現(xiàn)驗(yàn)證碼圖片代碼分享

    在Python web中實(shí)現(xiàn)驗(yàn)證碼圖片代碼分享

    這篇文章主要介紹了在Python web中實(shí)現(xiàn)驗(yàn)證碼圖片代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 淺談python下含中文字符串正則表達(dá)式的編碼問題

    淺談python下含中文字符串正則表達(dá)式的編碼問題

    今天小編就為大家分享一篇淺談python下含中文字符串正則表達(dá)式的編碼問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 如何在python中實(shí)現(xiàn)capl語言里的回調(diào)函數(shù)(推薦)

    如何在python中實(shí)現(xiàn)capl語言里的回調(diào)函數(shù)(推薦)

    CAPL是一種程序語言,其中程序塊的執(zhí)行由事件控制,主要介紹了如何在python中實(shí)現(xiàn)capl語言里的回調(diào)函數(shù)及事件函數(shù)的作用,需要的朋友可以參考下
    2022-08-08
  • python批量讀取文件名并寫入txt文件中

    python批量讀取文件名并寫入txt文件中

    這篇文章主要為大家詳細(xì)介紹了python批量讀取文件名并寫入txt文件中,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Python實(shí)現(xiàn)求兩個(gè)csv文件交集的方法

    Python實(shí)現(xiàn)求兩個(gè)csv文件交集的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)求兩個(gè)csv文件交集的方法,涉及Python針對csv文件的讀取、遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09

最新評論