一、多型
二、多型性
1.什麼是多型性?
多型性是指在不考慮例項型別的情況下使用例項,多型性分為靜態多型性和動態多型性
靜態多型性:如任何型別都可以用運算子+進行運算
動態多型性:如下
import abc
class animals(metaclass=abc.abcmeta):
@abc.abstractmethod
def talk(self):
pass
class people(animals):
def talk(self):
print('people is talking')
class cat(animals):
def talk(self):
print('cat is miaomiao')
class dog(animals):
def talk(self):
print('dog is wangwang')
cat1 = cat()
dog1 = dog()
peo1 = people()
# peo、dog、pig都是動物,只要是動物肯定有talk方法
# 於是我們可以不用考慮它們三者的具體是什麼型別,而直接使用
peo1.talk()
dog1.talk()
peo1.talk()
# 定義乙個統一的介面來訪問
def func(obj):
obj.talk()
func(cat1)
2.為什麼要用多型性?
①增加了程式的靈活性
以不變應萬變,不論物件千變萬化,使用者都是同一種形式去呼叫,如func(animal)
②增加了程式額可擴充套件性
通過繼承animal類建立了乙個新的類,使用者無需更改自己的**,還是用func(animal)去呼叫
class pig(animals): # 屬於動物的另外一種形態:豬
def talk(self):
print('pig is huohuo')
pig = pig()
# 統一介面,對於使用者來說,自己的**根本無需改動
def func(obj):
obj.talk()
func(pig) # 甚至連呼叫方式都無需改變,就能呼叫出pig的talk功能
三、鴨子型別
在鴨子型別中,關注的不是物件的型別本身,而是它是如何使用的。
例如,在不使用鴨子型別的語言中,我們可以編寫乙個函式,它接受乙個型別為"鴨子"的物件,並呼叫它的"走"和"叫"方法。在使用鴨子型別的語言中,這樣的乙個函式可以接受乙個任意型別的物件,並呼叫它的"走"和"叫"方法。如果這些需要被呼叫的方法不存在,那麼將引發乙個執行時錯誤。任何擁有這樣的正確的"走"和"叫"方法的物件都可被函式接受的這種行為引出了以上表述,這種決定型別的方式因此得名。
鴨子型別通常得益於不測試方法和函式中引數的型別,而是依賴文件、清晰的**和測試來確保正確使用。
class duck():
def walk(self):
print('i walk like a duck')
def swim(self):
print('i swim like a duck')
class person():
def walk(self):
print('this one walk like a duck')
def swim(self):
print('this man swim like a duck')
可以很明顯的看出,person類擁有跟duck類一樣的方法,當有乙個函式呼叫duck類,並利用到了兩個方法walk()和swim()。我們傳入person類也一樣可以執行,函式並不會檢查物件的型別是不是duck,只要他擁有walk()和swim()方法,就可以正確的被呼叫。
再舉例,如果乙個物件實現了__getitem__方法,那python的直譯器就會把它當做乙個collection,就可以在這個物件上使用切片,獲取子項等方法;如果乙個物件實現了__iter__和next方法,python就會認為它是乙個iterator,就可以在這個物件上通過迴圈來獲取各個子項。
Python 3 多型與多型性
多型 同一事物的多種形態 多型性 指的是可以在不考慮物件的型別的情況下而直接使用物件 import abc class animal metaclass abc.abcmeta 同一事物 動物 abc.abstractmethod def talk self pass class people an...
python3 類的多型與多型性
解釋的很深刻 很多人喜歡將多型與多型性二者混為一談,然後百思不得其解,其實只要分開看,就會很明朗。多型指的是一類事物有多種形態,乙個抽象類有多個子類,因而多型的概念依賴於繼承 序列型別有多種形態 字串,列表,元組 動物有多種形態 人,狗,豬 多型 同一種事物的多種形態,動物分為人類,豬類 在定義角度...
python3 切片 python3 切片
取乙個list或tuple的部分元素是非常常見的操作。比如,乙個list如下 l michael sarah tracy bob jack 取前3個元素,應該怎麼做?笨辦法 l 0 l 1 l 2 michael sarah tracy 之所以是笨辦法是因為擴充套件一下,取前n個元素就沒轍了。取前n...