第四章 朝思暮想是對象

朝思暮想是對象

4.1 輕松看對象

1. 面向?qū)ο?/h5>

前面第三章講到了Python面向過程的編程范式,即函數(shù)模塊,它們提高了程序的可用性,而面向?qū)ο?/strong>中的對象,也同樣有此功用,此外它們兩種語法結(jié)構(gòu)加強(qiáng)了程序模擬真實(shí)世界的能力。
對于Python,它是一門面向?qū)ο?/strong>的語言,只是它允許程序員以面向過程的方式來使用它。
那么,什么叫面向?qū)ο??什么叫面向過程呢?
通俗地解釋一下,以如何殺惡龍為例子:
面向過程(Procedure Oriented 簡稱PO :C......):
1.執(zhí)行找到劍方法
2.執(zhí)行招募幫手方法
3.執(zhí)行找到惡龍方法
4.執(zhí)行殺死惡龍方法
可以寫成 殺龍(找到劍,招募幫手,找到惡龍,殺死惡龍)
過程,過程,自然是注重過程的,也就不存在對象,僅僅通過一個(gè)個(gè)方法去達(dá)成目的。

面向?qū)ο螅∣bject Oriented簡稱OO :C++,JAVA......):
創(chuàng)建對象勇士,賦予對象一些屬性和方法,則有 勇士:找到劍方法 招募幫手方法 找到惡龍方法 殺死惡龍方法
然后可以寫成 勇士.殺龍(找到劍,招募幫手,找到惡龍,殺死惡龍)
對象,對象,自然是注重對象的,先創(chuàng)建對象,然后用對象執(zhí)行方法的方式來達(dá)成目的。

2. 類

編程中的其實(shí)與我們?nèi)粘I钪械摹悺母拍畈畈欢?,其作用就是根?jù)不同屬性方法個(gè)體(對象)進(jìn)行分類。用關(guān)鍵字class來定義一個(gè)類,通過冒號的強(qiáng)制縮進(jìn),便把其中的屬性和方法便賦予這個(gè)類而形成從屬關(guān)系。代碼說明如下:

class Bird(object):         #Bird是類名,object是對象名
    feather = True          
    reproduction = "egg"    #feather和reproduction是屬性
    def chirp(self,sound):
        print(sound)        #chirp()是方法,其中self是為了在方法內(nèi)部引用自身
3. 對象

創(chuàng)建對象:

summer = Bird()

小雞名為summer是對象,且屬于鳥類。
對象summer便擁有了屬于鳥類的屬性和方法。
對屬性的引用:對象.屬性
對方法的引用:對象.方法()

print(summer.reproduction)    #打印出"egg"
summer.chirp("jijijiji")      #打印出“jijijiji”

類里面的屬性和方法,有時(shí)候并不適合類中某些對象,這時(shí)我們對類進(jìn)行拓展,使得對象可以調(diào)用方法以說明自身的個(gè)性。代碼示例如下:

class Bird(object):
    def chirp(self,sound):
        print(sound)
    def set_color(self,color):
        self.color = color

summer = Bird()
summer.set_color("yellow")
print(summer.color)                #打印“yellow”

對象屬性依賴于self,而沒辦法像類一樣,在類下方直接賦值。這時(shí)我們就用Python定義的一種特殊方法——魔法方法 來實(shí)現(xiàn)對象屬性的賦值(初始化),此類方法有如:__init()__、__add()__、__dict()__等等(格式:前后皆有兩個(gè)下劃線)。代碼如下:

class Bird(object):
    def __init__(self,sound):
        self.sound = sound
        print("my sound is:", sound)
    def chrip(self):
        print(self.sound)

summer = Bird("ji")
summer.chrip()                      #打印出"ji"

此類方法會在創(chuàng)建對象時(shí)自動調(diào)用。
self不僅可以操作對象屬性,還可以讓我們在一個(gè)方法內(nèi)部調(diào)用同類其他方法:

class Bird(object):
    def chrip(self):
        print(self.sound)
    def chirp_repeat(self,sound,n):
        for i in range(n):
            self.chirp(sound)

summer = Bird()
summer.chirp_repeat("ji",6)       #打印出6個(gè)“ji”

4.2繼承者們

1. 子類

提到子類,就會想到父類,父子就會有繼承關(guān)系。類別進(jìn)一步細(xì)分成子類,子類包含了相應(yīng)對象的一些個(gè)性特點(diǎn),而又繼承了主類或父類的屬性特征。代碼格式呈現(xiàn):

class 子類名(父類名):
    子類的屬性(語句塊)

繼承相當(dāng)于在父類的屬性基礎(chǔ)上繼續(xù)添加個(gè)性屬性。

2. 屬性覆蓋

這個(gè)也比較好理解,子類相同屬性或方法 覆蓋 父類相同屬性或方法,其實(shí)是調(diào)用子類時(shí)會優(yōu)先調(diào)用自身的屬性和方法,無則調(diào)用父類的屬性和方法。

那么這時(shí)候就會出現(xiàn)一種情況,我僅僅想擴(kuò)展父類的屬性或方法,而不是把它全部覆蓋,這種情況下我們可以通過super關(guān)鍵字在子類中調(diào)用父類中被覆蓋的方法。格式有如:

class 子類名(父類名):
    def 父類函數(shù)/方法名(參數(shù)):
        super().父類中的方法名()
        ...

4.3 那些年,錯過的對象

1. 列表對象

數(shù)據(jù)容器——列表也是一個(gè)類,即list是列表類的類名。
type():查類型(類型就是對象所屬的類的名字)
dir():查類或者對象的所有屬性
help():查類的說明文檔
pass關(guān)鍵字:一般用在說明文檔,說明在該語法結(jié)構(gòu)中“什么也不做”
列表查詢方法
list.count(n):元素n計(jì)數(shù)
list.index(n):查元素n第一次出現(xiàn)時(shí)的下標(biāo)
列表修改方法:
list.append(元素):在列表最后添加一個(gè)新元素
list.sort():排序
list.reverse():顛倒排序
list.pop():去掉最后一個(gè)元素,并將該元素返回
list.remove(n):去掉第一次出現(xiàn)的元素n
list.insert(m,n):在下標(biāo)為m的位置插入元素n
list.clear():清空列表

2. 元組與字符串對象

元組查詢方法
puple.count(n):元素n計(jì)數(shù)
puple.index(n):查元素n第一次出現(xiàn)時(shí)的下標(biāo)
字符串對象的方法
str.count():計(jì)數(shù)子字符串出現(xiàn)次數(shù)
str.find() | str.rfind():從左 | 右開始,查找子字符串第一次出現(xiàn)的位置,不含則返回 -1
str.index() | str.rindex:從左 | 右開始,查找子字符串第一次出現(xiàn)的下標(biāo),不含則舉出錯誤
str.is(alnum、alpha、digit、title、space、lower、upper)():判斷字符串中是否全為字母或數(shù)字、全是字母、全是數(shù)字、詞的首字母全為大寫、全為空格、全是小寫字母、全是大寫字母
str.split | rsplit([sep,[n]]):從左 | 右開始,以空格(可以用其他符號)為分隔符,分割n次
str.join(s):將s中的元素,以str為分隔符進(jìn)行分割,合并成一個(gè)字符串
除上面,還有以下的方法,便不一一贅述了:
str.strip(sub)、str.replace(sub,new_sub)、str.capitalize()、str.lower()、str.upper()、str.swapcase()、str.title()、str.center(width)、str.ljuest(width)、str.rjust(width)

3. 詞典對象

詞典方法:
dict.keys():返回詞典元素的鍵
dict.values():返回詞典元素的值
dict.items():返回詞典元素(鍵值對)
dict.clear():清空整個(gè)詞典

4.4 意想不到的對象

1. 循環(huán)對象

循環(huán)對象包含有一個(gè)__next__()方法,此方法的目的是生成循環(huán)的下一結(jié)果。
內(nèi)置方法iter()可以把一個(gè)支持迭代的集合對象轉(zhuǎn)變?yōu)?strong>循環(huán)對象

for結(jié)構(gòu)等于自動調(diào)用__next__()方法。
可借助生成器來自定義循環(huán)對象,示例如下:


def shengchengqi():
    a = 100
    yield a
    a = a*8
    yield a
    yield 1000

for i in shengchengqi():
    print(i)                  #打印出“100 800 1000”

每次調(diào)用生成器,會返回yield后面的值,并且終止此次調(diào)用,下一次調(diào)用時(shí),才會繼續(xù)返回下一個(gè)yield后面的值,即yield有return和break的功用。

2. 函數(shù)對象

函數(shù)也是一種對象。含有__call__()特殊方法的對象都被當(dāng)作函數(shù)

3.模塊對象

模塊也是對象。回歸到前面的模塊知識,模塊即是.py文件,可以把它看作一個(gè)對象,其中的函數(shù)即是模塊對象中的屬性或方法。
每個(gè)模塊對象都有一個(gè)__name__屬性來記錄模塊的名字。

4. 異常對象

對于try結(jié)構(gòu)捕捉到的異常也是一個(gè)對象。
創(chuàng)建異常對象:

raise ZeroDivisionError()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容