天天看點

多态|學習筆記

開發者學堂課程【Python 語言基礎 3:函數、面向對象、異常處理:多态】學習筆記,與課程緊密聯系,讓使用者快速學習知識。

課程位址:

https://developer.aliyun.com/learning/course/601/detail/8754

多态

内容簡介

一、多态的定義

二、面向對象的三大特征

多态是面向對象的三大特征之一

多态從字面上了解是多重形态

一個對象可以以不同的形态去呈現

例如:定義兩類

Class A:

Def __init__(self,name):

Self._name = name

@property

def  name(self):

return self._name

@name. setter

def  name(self ,name):

Self._name=name

Class B:

def__init__(self, name) :

self._ name=name

def__len__(self):

return 10

@property

def  name(self ) :

return self. name

@name.setter

def  name(self, name ):

self.2 name = name

Class C:

pass

a = A( ‘孫悟空’)

b = B(‘豬八戒’)

c = C( )

1、定義一個函數

l對于 say_hello( ) 這個函數來說,隻要對象中含有 name 屬性,它就可以作為參數傳遞,這個函數并不會考慮對象的類型,隻要有 name 屬性即可,這就是多态。

def  say_hello(obj):

print(‘你好%s’%obj.name)

l 在 say_hello_2 中做了一個類型檢查,隻有 obj 是 A 類型的對象時,才可以正常使用,其他類型的對象都無法使用該函數,這個函數就違反了多态

l 注意:像 isinstance() 違反多态代碼的這種函數,在開發中一般是不會使用的

def say_hello_2(obj):

#做類型檢查

If  isinstance(obj  ,A)

print(‘你好%s’%obj.name)

l 違反了多态的函數,隻适用于一種類型的對象,無法處理其他類型對象,這樣導緻函數的适應性非常差

2、了解多态:鴨子類型

l 如果一個東西,走路像鴨子,叫聲像鴨子,那麼它就是鴨子

l 有了多态以後方法、定義更加的靈活、參數不用考慮具體類型,隻需要確定符合某個特征、某個屬性、某個方法,隻要符合某個特征,就可以使用多态。

3、舉例 len()函數(多态最好的展現)

1 =[1,2,3]

S = ‘hello’

print(len(10))

print(len(s))

print(len(b))

l 之是以一個對象能通過 len()來擷取長度,是因為對象中具有一個特殊的方法_ len_ 換句話說,隻要對象中具有 _ len_ 特殊方法,就可以通過 len( )來擷取它的長度.

二、面向對象的三大特征(所有面向對象的語言必須具備這三個特點)

1、封裝:確定對象中的資料安全

2、繼承:保證了對象的可擴充性

3、多态:保證了程式的靈活性,如果我們的方法、類型和概念綁定,函數的通用性将會降低,當具有了多态,函數便更加靈活。