多態是物件導向語言的一個基本特性,多態意味著變數並不知道引用的對象是什麼,根據引用對象的不同表現不同的行為方式。在處理多態對象時,只需要關注它的介面即可,Python中並不需要顯示的編寫(像Java一樣)介面,在使用對象的使用先假定有該介面,如果實際並不包含,在運行中報錯。
class handGun():
def __init__(self):
pass
def fire(self):
print 'handGun fire'
class carbine():
def __init__(self):
pass
def fire(self):
print 'carbine fire'
import handGun
import carbine
class gunFactory():
def __init__(self,gun_type):
self.gun_type = gun_type
def produce(self):
if handGun == self.gun_type:
return handGun.handGun()
else:
return carbine.carbine()
用戶端
fa = gunFactory(handGun)
gun = fa.produce()
只要是槍,就認為它具有開火的功能,如果沒有開火的功能,程式運行中就報錯
gun.fire()
可以看到跟一般的靜態語言相比,python並沒有在語言層級來保證介面的正確性,只能依靠文檔、代碼來保證,可以在代碼中檢查介面是否存在hasattr(gun,’fire’)。
我們再來看一個例子,方法多態:
我們首先建立一個名為MyClass.py的檔案,代碼如下
__author__= 'MXi4oyu'
classPeople:
def say(self):
print("大家好!")
classStudent:
def say(self):
print("老師好!")
我們再建立一個Main.py的檔案,代碼如下:
__author__= 'MXi4oyu'
fromrandom import choice
importMyClass
p1=MyClass.People()
stu1=MyClass.Student()
#通過choice方法我們可以隨機播放列表中的某一項
obj=choice([p1,stu1])
print(type(obj))
obj.say()
我們建立的臨時對象obj是由隨機函數取出來的,我們不知道它的具體類型,但是我們可以對它進行相同的操作。即讓它調用say方法,然後根據其類型的不同,它所表現的行為不同。這就是多態。