日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python对象三个特性_python面向对象的三大特性

發布時間:2023/12/19 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python对象三个特性_python面向对象的三大特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、繼承

面向對象中的繼承就是繼承的類直接擁有被繼承類的屬性而不需要在自己的類體中重新再寫一遍,其中被繼承的類叫做父類、基類,繼承的類叫做派生類、子類。在python3中如果不指定繼承哪個類,默認就會繼承Object類,而繼承了Object類的類就叫做新式類,而在python2中如果不指定繼承哪個類也不會默認去繼承Object類,而沒有繼承Object類的類就叫做經典類。經典類和新式類的不同就在于對方法的搜索順序不同,經典類是深度優先即先找自己類內,如果沒有就找左邊第一個父類,沒找到繼續從這個父類的父類中找依次類推直到找到最上一級的父類也沒找到再找左邊第二個父類,然后再重復之前的過程,直到所有父類找一遍沒找到就報錯;而新式類是廣度優先,當下一個類可以通過其他類找到時就先不去找它,而是找繼承關系中與它的子類同級的其他類,依次類推直到最后找到object類沒有找到指定方法就報錯。新式類搜索順序圖示如下,還可以通過類名.mro()查看新式類繼承中的屬性搜索順序

二、單繼承與多繼承

在其他語言中只支持單繼承即class 類名(父類名),而python支持多繼承,用逗號將多個父類隔開即class 類名(父類名1,父類名2,。。。。)

三、繼承與抽象

抽象就是把一類事物的共有特性提取出來,繼承則是把父類的屬性拿過來并且還擁有自己的屬性。抽象是包含的范圍越來越大,共性越來越少,繼承則是包含的返回越來越小,共性越來越多。我們定義父類的過程就是抽象,定義子類的過程就是繼承。

四、父類方法重寫

我們把子類有而父類沒有的方法叫做子類的派生方法,而父類有子類也有的方法叫做對父類方法的重寫,因為按照類方法的搜索順序一個方法如果在子類中有就不會再從父類中找了,結果就是父類中的方法無法調用了,如果既想執行父類中的方法同時在子類中又能定義新功能,就需要先把父類中的這個方法單獨繼承過來,在python中只能使用父類名.方法名(self,父類的其他參數)的方式,在python3中可以使用super函數來實現,比如super().父類方法名(除self外的其他參數),其實在super函數中還需要傳入子類名和子類對象(在類中用self),但是我們使用時不需要特意去傳,除非在類外單獨調用父類的方法。注意在繼承父類方法時父類的參數除了需要在父類的方法中傳遞還需要在子類重寫的方法中傳遞

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

五、接口類

接口類是用于規范子類的方法名定義用的,繼承接口類的子類可以不存在任何邏輯上的關系但是都需要實現某些共同的方法,為了讓這些子類的方法名能夠統一以便之后調用這些方法時不需要關注具體的對象就用接口類規范了這些方法的名字,子類一旦繼承了接口類就必須實現接口類中定義的方法,否則在子類實例化的時候就會報錯,而接口類本身則不需要實現去實現這些方法。

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): #子類中必須定義接口類中有的方法,否則實例化會報錯

8 pass

9

10 w1=Wechatpay()

六、抽象類

抽象類的作用和接口類一樣,只是繼承它的子類一般存在一些邏輯上的關系,且抽象類中的方法可以去實現,子類在重寫時用super函數調用抽象類的方法即可,同時在用抽象類時使用單繼承,使用接口類時使用多繼承

七、多態

多態就是不同的對象可以調用相同的方法然后得到不同的結果,有點類似接口類的感覺,在python中處處體現著多態,比如不管你是列表還是字符串還是數字都可以使用+和*。

八、封裝

封裝就是把類中的屬性和方法定義為私有的,方法就是在屬性名或方法名前加雙下劃線,而一旦這樣定義了屬性或方法名后,python會自動將其轉換為_類名__屬性名(方法名)的格式,在類的內部調用還是用雙下劃線加屬性名或方法名,在類的外部調用就要用_類名__屬性名(方法名)。父類的私有屬性和方法,子類無法對其進行修改。

九、類的裝飾器

property屬性裝飾器:將類內的方法的調用方式和屬性一樣,這個裝飾器還有和其配套的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靜態方法裝飾器:將類內的方法變成普通的函數,或者把類外的函數放到類內當作方法調用

classA:

@staticmethoddef sum(): #這個方法跟普通函數沒有區別

print('staticmethod')A.sum() #用類名調用--------------------------------------------------------------------------------------staticmethod

classmethod類方法裝飾器:該方法用于操作類屬性,無法操作對象屬性

classA:

role='male'@classmethoddef sum(cls): #用于操作類屬性

print(cls.role)

A.sum()#用類名調用

--------------------------------------------------------------------------------------male

十、isinstance和type的區別以及issubclass

isinstance和type都可以用于判斷對象和指定類間的關系,但是isinstance的判斷沒有type準確,它無法正確判斷子類的對象和其父類的關系

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用于判斷給定的兩個類,前者是否是后者的子類

十一、反射

hasattr(對象或類名,‘屬性或方法名’) 判斷指定的對象或類中是否存在指定的屬性或方法,有返回True

getattr(對象或類名,'屬性或方法名') 獲取對象或類的指定屬性值或方法的內存地址

setattr(對象或類名,‘新屬性名’,新屬性值) 給對象或類添加新的屬性或方法

delattr(對象或類名,‘新屬性名’) 刪除之前添加的屬性

十二、類的內置方法

__doc__ :輸出類的描述信息

__module__ :表示當前操作的對象在那個模塊

__class__ : 表示當前操作的對象的類是什么

__dict__ :查看類或對象中的所有成員 類調用打印類的所有屬性,不包括實例屬性。實例調用打印所有實例屬性

__str__ 格式化輸出%s輸出該方法的值

__repr__ 格式化輸出%r輸出該方法的值,并且%s在沒有__str__方法時也是輸出該方法的值

__del__ del 執行該方法

__getitem__ 用對象加[]方式取值

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__ 用于創建沒有屬性的對象,調用object的__new__即可不需要自己實現??梢岳迷摲椒▽崿F單例模式

__call__ 對象加括號執行該方法

__len__ len()執行該方法

__eq__ ==運算輸出該方法的值

__hash__ hash執行該方法

總結

以上是生活随笔為你收集整理的python对象三个特性_python面向对象的三大特性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。