python对象三个特性_python面向对象的三大特性
一、繼承
面向?qū)ο笾械睦^承就是繼承的類直接擁有被繼承類的屬性而不需要在自己的類體中重新再寫一遍,其中被繼承的類叫做父類、基類,繼承的類叫做派生類、子類。在python3中如果不指定繼承哪個(gè)類,默認(rèn)就會(huì)繼承Object類,而繼承了Object類的類就叫做新式類,而在python2中如果不指定繼承哪個(gè)類也不會(huì)默認(rèn)去繼承Object類,而沒有繼承Object類的類就叫做經(jīng)典類。經(jīng)典類和新式類的不同就在于對(duì)方法的搜索順序不同,經(jīng)典類是深度優(yōu)先即先找自己類內(nèi),如果沒有就找左邊第一個(gè)父類,沒找到繼續(xù)從這個(gè)父類的父類中找依次類推直到找到最上一級(jí)的父類也沒找到再找左邊第二個(gè)父類,然后再重復(fù)之前的過程,直到所有父類找一遍沒找到就報(bào)錯(cuò);而新式類是廣度優(yōu)先,當(dāng)下一個(gè)類可以通過其他類找到時(shí)就先不去找它,而是找繼承關(guān)系中與它的子類同級(jí)的其他類,依次類推直到最后找到object類沒有找到指定方法就報(bào)錯(cuò)。新式類搜索順序圖示如下,還可以通過類名.mro()查看新式類繼承中的屬性搜索順序
二、單繼承與多繼承
在其他語言中只支持單繼承即class 類名(父類名),而python支持多繼承,用逗號(hào)將多個(gè)父類隔開即class 類名(父類名1,父類名2,。。。。)
三、繼承與抽象
抽象就是把一類事物的共有特性提取出來,繼承則是把父類的屬性拿過來并且還擁有自己的屬性。抽象是包含的范圍越來越大,共性越來越少,繼承則是包含的返回越來越小,共性越來越多。我們定義父類的過程就是抽象,定義子類的過程就是繼承。
四、父類方法重寫
我們把子類有而父類沒有的方法叫做子類的派生方法,而父類有子類也有的方法叫做對(duì)父類方法的重寫,因?yàn)榘凑疹惙椒ǖ乃阉黜樞蛞粋€(gè)方法如果在子類中有就不會(huì)再?gòu)母割愔姓伊?#xff0c;結(jié)果就是父類中的方法無法調(diào)用了,如果既想執(zhí)行父類中的方法同時(shí)在子類中又能定義新功能,就需要先把父類中的這個(gè)方法單獨(dú)繼承過來,在python中只能使用父類名.方法名(self,父類的其他參數(shù))的方式,在python3中可以使用super函數(shù)來實(shí)現(xiàn),比如super().父類方法名(除self外的其他參數(shù)),其實(shí)在super函數(shù)中還需要傳入子類名和子類對(duì)象(在類中用self),但是我們使用時(shí)不需要特意去傳,除非在類外單獨(dú)調(diào)用父類的方法。注意在繼承父類方法時(shí)父類的參數(shù)除了需要在父類的方法中傳遞還需要在子類重寫的方法中傳遞
classAnimal:def __init__(self,name,life_value,aggr):
self.name=name
self.life_value=life_value
self.aggr=aggrdefeat(self):
self.life_value+=10
classPerson(Animal):def __init__(self,money,name,life_value,aggr):
super().__init__(name,life_value,aggr)
self.money=moneydefattack(self,obj):
obj.life_value-=self.aggr
五、接口類
接口類是用于規(guī)范子類的方法名定義用的,繼承接口類的子類可以不存在任何邏輯上的關(guān)系但是都需要實(shí)現(xiàn)某些共同的方法,為了讓這些子類的方法名能夠統(tǒng)一以便之后調(diào)用這些方法時(shí)不需要關(guān)注具體的對(duì)象就用接口類規(guī)范了這些方法的名字,子類一旦繼承了接口類就必須實(shí)現(xiàn)接口類中定義的方法,否則在子類實(shí)例化的時(shí)候就會(huì)報(bào)錯(cuò),而接口類本身則不需要實(shí)現(xiàn)去實(shí)現(xiàn)這些方法。
1 from abc importABCMeta,abstractmethod2 class Payment(metaclass=ABCMeta):3 @abstractmethod4 def pay(self,money):pass
5
6 classWechatpay(Payment):7 def pay(self,money): #子類中必須定義接口類中有的方法,否則實(shí)例化會(huì)報(bào)錯(cuò)
8 pass
9
10 w1=Wechatpay()
六、抽象類
抽象類的作用和接口類一樣,只是繼承它的子類一般存在一些邏輯上的關(guān)系,且抽象類中的方法可以去實(shí)現(xiàn),子類在重寫時(shí)用super函數(shù)調(diào)用抽象類的方法即可,同時(shí)在用抽象類時(shí)使用單繼承,使用接口類時(shí)使用多繼承
七、多態(tài)
多態(tài)就是不同的對(duì)象可以調(diào)用相同的方法然后得到不同的結(jié)果,有點(diǎn)類似接口類的感覺,在python中處處體現(xiàn)著多態(tài),比如不管你是列表還是字符串還是數(shù)字都可以使用+和*。
八、封裝
封裝就是把類中的屬性和方法定義為私有的,方法就是在屬性名或方法名前加雙下劃線,而一旦這樣定義了屬性或方法名后,python會(huì)自動(dòng)將其轉(zhuǎn)換為_類名__屬性名(方法名)的格式,在類的內(nèi)部調(diào)用還是用雙下劃線加屬性名或方法名,在類的外部調(diào)用就要用_類名__屬性名(方法名)。父類的私有屬性和方法,子類無法對(duì)其進(jìn)行修改。
九、類的裝飾器
property屬性裝飾器:將類內(nèi)的方法的調(diào)用方式和屬性一樣,這個(gè)裝飾器還有和其配套的setter、deleter。
classDemo:
@propertydefp(self):print('property func')
@p.setterdefp(self,num):print('property_setter')
@p.deleterdefp(self):print('在刪除')
d=Demo()
d.p
d.p=10
deld.p--------------------------------------------------------------------------------------property func
property_setter
在刪除
staticmethod靜態(tài)方法裝飾器:將類內(nèi)的方法變成普通的函數(shù),或者把類外的函數(shù)放到類內(nèi)當(dāng)作方法調(diào)用
classA:
@staticmethoddef sum(): #這個(gè)方法跟普通函數(shù)沒有區(qū)別
print('staticmethod')A.sum() #用類名調(diào)用--------------------------------------------------------------------------------------staticmethod
classmethod類方法裝飾器:該方法用于操作類屬性,無法操作對(duì)象屬性
classA:
role='male'@classmethoddef sum(cls): #用于操作類屬性
print(cls.role)
A.sum()#用類名調(diào)用
--------------------------------------------------------------------------------------male
十、isinstance和type的區(qū)別以及issubclass
isinstance和type都可以用于判斷對(duì)象和指定類間的關(guān)系,但是isinstance的判斷沒有type準(zhǔn)確,它無法正確判斷子類的對(duì)象和其父類的關(guān)系
classA:pass
classB(A):passb=B()print(isinstance(b,B))print(isinstance(b,A))print(type(b) isB)print(type(b) isA)--------------------------------------------------------------------------------------True
True
True
False
issubclass用于判斷給定的兩個(gè)類,前者是否是后者的子類
十一、反射
hasattr(對(duì)象或類名,‘屬性或方法名’) 判斷指定的對(duì)象或類中是否存在指定的屬性或方法,有返回True
getattr(對(duì)象或類名,'屬性或方法名') 獲取對(duì)象或類的指定屬性值或方法的內(nèi)存地址
setattr(對(duì)象或類名,‘新屬性名’,新屬性值) 給對(duì)象或類添加新的屬性或方法
delattr(對(duì)象或類名,‘新屬性名’) 刪除之前添加的屬性
十二、類的內(nèi)置方法
__doc__ :輸出類的描述信息
__module__ :表示當(dāng)前操作的對(duì)象在那個(gè)模塊
__class__ : 表示當(dāng)前操作的對(duì)象的類是什么
__dict__ :查看類或?qū)ο笾械乃谐蓡T 類調(diào)用打印類的所有屬性,不包括實(shí)例屬性。實(shí)例調(diào)用打印所有實(shí)例屬性
__str__ 格式化輸出%s輸出該方法的值
__repr__ 格式化輸出%r輸出該方法的值,并且%s在沒有__str__方法時(shí)也是輸出該方法的值
__del__ del 執(zhí)行該方法
__getitem__ 用對(duì)象加[]方式取值
classA:def __init__(self):
self.names=['egon','alex','eva'] #可以是其他序列
def __getitem__(self, item):print(self.names[item])
a=A()
a[1]
----------------------------------------------------------
alex
__setitem__ 添加值
__delitem__ 刪除值
__new__ 用于創(chuàng)建沒有屬性的對(duì)象,調(diào)用object的__new__即可不需要自己實(shí)現(xiàn)。可以利用該方法實(shí)現(xiàn)單例模式
__call__ 對(duì)象加括號(hào)執(zhí)行該方法
__len__ len()執(zhí)行該方法
__eq__ ==運(yùn)算輸出該方法的值
__hash__ hash執(zhí)行該方法
總結(jié)
以上是生活随笔為你收集整理的python对象三个特性_python面向对象的三大特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨越解决方案之nginx
- 下一篇: python按键_【python】pyt