4 [面向对象]-三大特性:多态
1、多態(tài)
多態(tài)指的是一類事物有多種形態(tài),比如
動(dòng)物有多種形態(tài):人,狗,豬
# 多態(tài):同一類事物的多種形態(tài) import abcclass Animal(object, metaclass=abc.ABCMeta): # 同一類事物:動(dòng)物@abc.abstractmethoddef talk(self):passclass People(Animal): # 動(dòng)物的形態(tài)之一:人def talk(self):print('say hi')class Dog(Animal): # 動(dòng)物的形態(tài)之二:狗def talk(self):print('wang wang wagn')class Cat(Animal): # 動(dòng)物的形態(tài)之三:貓def talk(self):print('miao miao miao')
2、多態(tài)性
(1)?什么是多態(tài)動(dòng)態(tài)綁定(在繼承的背景下使用時(shí),有時(shí)也稱為多態(tài)性)
多態(tài)性是指在不考慮實(shí)例類型的情況下使用實(shí)例,多態(tài)性分為靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性
靜態(tài)多態(tài)性:如任何類型都可以用運(yùn)算符+進(jìn)行運(yùn)算動(dòng)態(tài)多態(tài)性:如下# 多態(tài)性:指的是可以在不考慮對(duì)象的類型的情況下而直接使用對(duì)象 alex = People() dog1 = Dog() tom = Cat()#peo、dog、pig都是動(dòng)物,只要是動(dòng)物肯定有talk方法 #于是我們可以不用考慮它們?nèi)叩木唧w是什么類型,而直接使用 alex.talk() dog1.talk() tom.talk()#更進(jìn)一步,我們可以定義一個(gè)統(tǒng)一的接口來(lái)使用 def func(obj):obj.talk()fun(alex) fun(dog1) fun(tom)
?
?
學(xué)開車
- 開奧迪
- 開特斯拉
- 開拖拉機(jī)
(2)為什么要用多態(tài)性(多態(tài)性的好處)
其實(shí)大家從上面多態(tài)性的例子可以看出,我們并沒(méi)有增加什么新的知識(shí),也就是說(shuō)python本身就是支持多態(tài)性的,這么做的好處是什么呢?
1.增加了程序的靈活性
以不變應(yīng)萬(wàn)變,不論對(duì)象千變?nèi)f化,使用者都是同一種形式去調(diào)用,如func(animal)
2.增加了程序額可擴(kuò)展性
通過(guò)繼承animal類創(chuàng)建了一個(gè)新的類,使用者無(wú)需更改自己的代碼,還是用func(animal)去調(diào)用
?
3、鴨子類型
逗比時(shí)刻:
Python崇尚鴨子類型,即‘如果看起來(lái)像、叫聲像而且走起路來(lái)像鴨子,那么它就是鴨子’
python程序員通常根據(jù)這種行為來(lái)編寫程序。例如,如果想編寫現(xiàn)有對(duì)象的自定義版本,可以繼承該對(duì)象
也可以創(chuàng)建一個(gè)外觀和行為像,但與它無(wú)任何關(guān)系的全新對(duì)象,后者通常用于保存程序組件的松耦合度。
?
例1:利用標(biāo)準(zhǔn)庫(kù)中定義的各種‘與文件類似’的對(duì)象,盡管這些對(duì)象的工作方式像文件,但他們沒(méi)有繼承內(nèi)置文件對(duì)象的方法
#二者都像鴨子,二者看起來(lái)都像文件,因而就可以當(dāng)文件一樣去用 class File(object):def read(self):print('file read')def write(self):print('file write')class Disk(object):def read(self):print('Disk read')def write(self):print('Disk write')class Text(object):def read(self):print('Text read')def write(self):print('Text write')file = File() disk = Disk() text = Text()file.read() file.write()?
例2:序列類型有多種形態(tài):字符串,列表,元組,但他們直接沒(méi)有直接的繼承關(guān)系
# 序列類型:list列表, 元組tuple, 字符串str l = list([1,2,3]) t = tuple(('a','b',3)) s = str('hello')# print(l.__len__()) # print(t.__len__()) # print(s.__len__())# 同一個(gè)接口 def len(obj):return obj.__len__()print(len(l)) print(len(t)) print(len(s))?
?
?
4
?
5
?
轉(zhuǎn)載于:https://www.cnblogs.com/venicid/p/8605622.html
總結(jié)
以上是生活随笔為你收集整理的4 [面向对象]-三大特性:多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网页常用动态效果--悬浮广告
- 下一篇: Docker入门(CentOS7)