python高階 五 多型和屬性訪問

2022-05-29 09:54:10 字數 2945 閱讀 2957

物件導向三大特徵:

封裝:將資料和方法放在乙個類中,構成封裝

繼承:子類繼承父類屬性和方法,可多繼承

多型:乙個事物有多種形態,乙個抽象類有多個子類,不同的子類物件呼叫相同的方法,產生不同的執行結果。多型可以增加**的靈活度。是基於類的繼承。

class

animal:

defrun(self):

raise attributeerror('

子類必須實現這個方法')

class

pig(animal):

defrun(self):

print('

pig is walking')

class

dog(animal):

defrun(self):

print('

dog is running')

deffunc(obj): # python的函式引數 無任何型別限制,可以是類本身,也可以是類的物件

obj.run()

pig1=pig()

d1=dog()

func(pig1)

func(d1)

多型的意義:開放封閉原則

對於乙個變數,我們只需要知道它的base型別,無需知道它的子型別,就可以放心的呼叫相同的方法quack();

當需要新增功能時,只需新增乙個base的子類實現quack()方法,就可以在原基礎上擴充套件功能,即開放封閉原則:

對擴充套件開放:允許新增乙個base的子類;

對修改封閉:不要修改base依賴型別的quack()函式;

鴨子型別

鴨子型別關注點在物件的行為,而不是型別。不要求嚴格的繼承體系。只要行為相似(內部實現相同的方法),即可視為鴨子型別。

class

duck:

def__init__

(self, name):

self.name =name

defquack(self):

print("

gua gua")

class

man:

def__init__

(self, name):

self.name =name

defquack(self):

print("

女王大人")

defdo_quack(ducker):

ducker.quack() if

__name__ == '

__main__':

d = duck('

duck')

m = man('

man'

) do_quack(d)

do_quack(m)

資料型別和自省:

1. 私有屬性:類裡面定義的屬性分為兩種:公有屬性和私有屬性

2. 私有屬性定義:

以單下劃線開頭_attr :類外部可以直接呼叫

以雙下劃線開頭的屬性__attr:類外部不能直接呼叫,被改名了,需要用 _類名__attr 訪問;

class

people:

#初始化引數

def__init__

(self, name):

self.name =name

self.

__age = 18 #

在需要設定的屬性或方法前加雙下劃線,即設定私有屬性或私有方法

defdisplay(self):

print('

%s的年齡是%d

' % (self.name, self.__age))

xiaoai = people('

小愛同學')

#此時age屬性為私有屬性,不能進行外部訪問,否則會報錯

#print(xiaoai.__age)

#以單下劃線+類名的顯示,可以訪問私有屬性

print

(xiaoai._people__age)

xiaoai.display()

3. python不能實現真正的私有屬性,但通過下劃線開頭,可以得到偽私有屬性。大部分python**遵循規則:以下劃線開頭的屬性為私有屬性,被視為非公開的api的一部分,僅用於實現細節。

4. __dict__:類.__dict__:返回該類 屬性、方法的字典;例項.__dict__:返回例項的 屬性、方法字典;例項.方法.__dict__:返回方法的 屬性、方法字典

__doc__: 類.__doc__:返回該類的注釋說明;例項.方法.__doc__:返回方法的注釋說明 ;模組.__doc__:返回py檔案模組的注釋說明文件

__slots__:類的屬性範圍鎖定,僅允許繫結__slots__= [ ]列表中已有的屬性,可節約記憶體,提高效能。

自定義屬性訪問

內建函式:

getattr: 獲取屬性 ,觸發魔術方法 object.__getattr__()

setattr: 設定屬性,觸發魔術方法 object.__setattr__()

delattr: 刪除屬性,觸發魔術方法 object.__delattr__()

1.object.__getattr__:當我們訪問屬性的時候,如果屬性不存在(出現attrerror),該方法會被觸發。

2.object.__getattrible__: 訪問屬性的時候,第一時間觸發該方法去找屬性。如果沒找到觸發attrerror。當我們去訪問乙個不存在的屬性時,首先會觸發__getattribute__,然後才會觸發__getattr__ 

如果屬性存在,就返回這個屬性值,如果沒有就報 attrerror

3.object.__setattr__:設定屬性

4.object.__delattr__:刪除屬性

Python多型和類屬性

多型指的是一類事物有多種形態。定義 多型是一種使用物件的方式,子類重寫父類方法,呼叫不同子類物件的相同父類方法,可以產生不同的執行結果。class dog defwork self pass class armydog dog def work self print 追擊敵人。class drugd...

Python高階 多型

物件導向三大特徵 封裝 繼承 多型 封裝 將資料和方法放在乙個類中就構成了封裝 繼承 python中乙個類可以繼承於乙個類也可以繼承多個類,被繼承的類叫做父類 或叫基類,base class 繼承的類叫子類 多型 指的是一類事物有多種形態,乙個抽象類有多個子類 因而多型的概念依賴於繼承 不同的子類物...

Python高階 property屬性

1.property屬性 是乙個提高開發者使用者體驗度的屬性,可以將乙個函式改造的像屬性一樣。例 定義的時候像是乙個函式 使用的時候和屬性的方式是以樣的 class foo object property defmoney self return 100 f foo m f.money print ...