11.Python的面向?qū)ο?/h2>

1.面向?qū)ο蠼榻B

面向過程:根據(jù)業(yè)務(wù)邏輯從上到下寫代碼.?

面向?qū)ο?將函數(shù)與數(shù)據(jù)綁定在一起,進(jìn)行封裝.

Python面向?qū)ο笕?封裝,繼承,多態(tài).

2.類和對(duì)象

2.1類

類(Class)由三部分構(gòu)成:名稱,屬性,方法

類的抽象:擁有相同或者類似屬性和行為的對(duì)象都可以抽象出一個(gè)類.

定義一個(gè)類示例:

#類名

class Cat:

????????#初始化方法

? ? ? ? def __init__(self,new_name,new_age):

? ? ? ? ????self.name=new_name

? ? ? ? ????self.age=new_age

? ? ? ? def __str__(self):

????????????????#相當(dāng)于Java中的toString()方法

???????????????return 描述信息

? ? ? ? #方法

? ? ? ? def eat(self):

????????????print('貓吃魚...')

? ? ? ? def desc(self):

????????????print('%s年齡是%s'%(self.name,self.age))

#創(chuàng)建對(duì)象

tom = Cat('咖啡',12)

tom.eat()

#為tom指定的對(duì)象添加屬性

#tom.name='咖啡'

#tom.age=11

self:相當(dāng)于Java中的this,指代當(dāng)前對(duì)象自身.

類中的方法,必須至少有一個(gè)參數(shù),參數(shù)名可以自定義,不一定非要self,推薦使用self,形成代碼規(guī)范.

__init__方法

在創(chuàng)建對(duì)象后會(huì)調(diào)用__init__方法,負(fù)責(zé)初始化,會(huì)把創(chuàng)建的對(duì)象的引用傳入__init__方法中,然后再將對(duì)象的引用返回

__str__方法

類似Java的toString()方法

return 對(duì)象描述信息

__del__方法

對(duì)象的引用計(jì)數(shù)為0時(shí),Python垃圾回收機(jī)制會(huì)銷毀該對(duì)象,然后會(huì)自動(dòng)調(diào)用類的__del__方法.

銷毀對(duì)象引用:del 對(duì)象引用

import sys

sys.getrefcount(x):查看x指向的對(duì)象的引用計(jì)數(shù),所得值比實(shí)際的引用計(jì)數(shù)多1.

__new__方法

創(chuàng)建對(duì)象時(shí)會(huì)被自動(dòng)調(diào)用,該方法是用來創(chuàng)建對(duì)象

class Cat(object):

? ? def __new__(cls):#cls此時(shí)是Cat所指向的類對(duì)象

? ? ? ?return object.__new__(cls)#調(diào)用父類的__new()__方法創(chuàng)建對(duì)象

cat = Cat()

#相當(dāng)于做了三件事:

#1,調(diào)用__new__方法來創(chuàng)建對(duì)象,然后用一個(gè)變量來接收__new__方法的返回值,這個(gè)返回值表示創(chuàng)建出來的對(duì)象的引用

#2,__init__(剛剛創(chuàng)建出來的對(duì)象的引用);

#3,返回對(duì)象的引用

在Python中__new__方法+__init__方法相當(dāng)于Java中的構(gòu)造方法,前者負(fù)責(zé)創(chuàng)建對(duì)象,后者負(fù)責(zé)初始化對(duì)象


隱藏對(duì)象的屬性:定義方法對(duì)類的屬性進(jìn)行設(shè)置和獲取,更加安全和符合面向?qū)ο蟮姆庋b思想.

私有方法:方法名前加兩個(gè)下劃線'__',適合類內(nèi)部封裝,一般私有的方法比較重要,不適合被外部調(diào)用.

私有屬性:屬性名前加兩個(gè)下劃線"__".

def __look(self):#私有方法

? ? self.__name='Anna'#私有屬性

? ? pass


3.全局變量,函數(shù)和屬性和方法的聯(lián)系和區(qū)別

相似點(diǎn)在于共享變量

不同點(diǎn)在于,類中的屬性和方法是封裝的,具有一點(diǎn)的私有性.

4.繼承

類共同屬性或方法的抽取.

父類,基類------子類,派生類

在Python中,可以多繼承,不同父類用逗號(hào)','分隔.也可以多層繼承

class 子類名(父類A,父類B):

? ? ? ? pass

多繼承注意事項(xiàng):

類名.__mro__:返回一個(gè)元組,該元組決定調(diào)用一個(gè)方法時(shí)的優(yōu)先順序.

推薦在不同類中,定義方法時(shí),采用不同的方法名.

在Python3中,父類中有object為新式類,沒有的為經(jīng)典類,推薦新建類時(shí)加上object

class Base(object):

? ? pass

私有方法和屬性不會(huì)被子類繼承.

class 子類名(父類名):

????def 子類自己的方法(self):

? ? ? ? ? ? pass



4.1方法重寫:

在子類中定義與父類方法名相同的方法,在方法中也可以調(diào)用父類的方法:父類名.方法名(self)

子類如果調(diào)用的是繼承自父類的公有方法,則可以在此公有方法中調(diào)用父類的私有方法和私有屬性;

子類不能在重寫的父類方法中調(diào)用父類的私有方法和私有屬性.


5.多態(tài)

子類在執(zhí)行相同的方法時(shí)所表現(xiàn)出的不同狀態(tài).

因?yàn)镻ython是動(dòng)態(tài)類型語言,故Python的多態(tài)沒有Java的多態(tài)體現(xiàn)的那么明顯.


6.類屬性與實(shí)例屬性

class 類名():

? ? age=0????#類屬性

? ? def 方法名(self):

? ? ? ? ? ? self.name='Anna'????#實(shí)例屬性

????????????pass


類也是對(duì)象,被稱為類對(duì)象;由類生成的實(shí)例稱為實(shí)例對(duì)象.類對(duì)象只有一個(gè),而實(shí)例對(duì)象可以有多個(gè).

類對(duì)象的屬性稱為類屬性;實(shí)例對(duì)象的屬性稱為實(shí)例屬性.

實(shí)例屬性和具體的某個(gè)實(shí)例對(duì)象有關(guān)系,并且一個(gè)實(shí)例對(duì)象和另外一個(gè)實(shí)例對(duì)象是不共享實(shí)例屬性的.

類屬性屬于類對(duì)象,并且在實(shí)例對(duì)象之間共享.

通過類名.類屬性名獲取類屬性的引用.

7.類方法,實(shí)例方法,靜態(tài)方法

class Game(object):

? ? ? ? num=0#類屬性

? ? ? ? @classmethod

? ? ? ? def add_num(cls):#類方法--cls只是命名規(guī)范

? ? ? ? ? ? ? ? cls.num = 100

? ? ? ? ? ? ? ? pass

? ? ? ? def __init__(self):#實(shí)例方法

? ? ? ? ? ? Game.add_num()#調(diào)用類方法:類名.類方法名或者實(shí)例對(duì)象.類方法名

? ? ? ? ? ? pass

? ? ? ? @staticmethod

? ? ? ? def print_info():#靜態(tài)方法

? ? ? ? ? ? pass



類方法:需要使用@classmethod進(jìn)行裝飾,必須有個(gè)參數(shù),可以通過類名.類方法名或者類的實(shí)例對(duì)象.類方法名進(jìn)行調(diào)用.

實(shí)例方法:類中沒有使用@classmethod以及@staticmethod進(jìn)行裝飾的方法,必須有個(gè)參數(shù).

靜態(tài)方法:使用@staticmethod進(jìn)行裝飾的方法,對(duì)參數(shù)個(gè)數(shù)沒有要求.可以通過類對(duì)象或?qū)嵗龑?duì)象調(diào)用靜態(tài)方法

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

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

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