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)方法