一、多態
多態是面向對象的三大特性之一,從字面上理解是多種形態。一個對象可以以不同的形態去呈現。
如狗(狼狗,泰迪,哈士奇...)
舉例如下:
#定義兩個類
class A:
def __init__(self,name):
self.__name = name
#getter和setter方法
@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
#getter和setter方法
@property
def name(self):
return self.__name
@name.setter
def name(self):
self.__name = name
#創建實例
a = A('蘇武')
b = B('李菜菜')
#定義一個函數
def say__hello(obj):
print('你好%s'%obj.name)
say__hello(a)
say__hello(b)
對於say__hello()這個函數來說,只要對象當中含有name屬性,它就可以作爲參數傳遞,對於這個函數並不會考慮對象的類型,只要有name屬性即可。
類型檢查
在say__hello_2()中做一個類型檢查,也就是隻有obj是A類型的對象時,纔可以正常使用,其他類型的對象都無法使用該函數。這個函數就違反了多態。
--違反了多態的函數,只適用於一種類型的對象,無法處理其它類型的對象,這樣導致函數的適應性非常的差。像是 isinstance一般就不要使用。
def say_hello_2(obj):
if isinstance(obj,A):
print('你好 %s'%obj.name)
say_hello_2(b)
#鴨子類型
如果一個東西,走路像鴨子,叫聲像鴨子,那麼它就是鴨子。
例子len():
之所以一個對象能通過len()來獲取長度,是因爲對象中具有一個特殊方法__len__,換句話說,只要對象中具有__len__特殊方法,就可以通過len()來獲取它的長度。
l = [1,2,3]
s ='hello'
print(len(l))
print(len(s))
二、面向對象三大特徵小結
1.封裝
--確保對象中數據的安全
2.繼承
--保證了對象的可擴展性
3.多態
--保證了程序的靈活性