- Python程序設(shè)計(jì)案例課堂
- 劉春茂
- 528字
- 2020-11-28 15:11:33
6.8 類的多態(tài)
所謂類的多態(tài)(polymorphism),就是類可以有許多個(gè)相同名稱但參數(shù)類型不同的函數(shù)。Python并沒有明顯的多態(tài)特性,因?yàn)镻ython函數(shù)的參數(shù)不必聲明數(shù)據(jù)類型。但是利用動態(tài)數(shù)據(jù)類型(dynamic typing), Python仍然可以處理對象的多態(tài)。
由于使用動態(tài)數(shù)據(jù)類型,Python必須等到運(yùn)行該函數(shù)時(shí)才知道該函數(shù)的類型,這種特性稱為運(yùn)行期綁定(runtime binding)。
C++將多態(tài)稱為方法重載(method overloading), C++可以允許類內(nèi)有許多個(gè)相同的名稱卻有不同參數(shù)的函數(shù)存在。
但是Python卻不允許這樣做,如果用戶在Python的類內(nèi)聲明多個(gè)相同的名稱卻有不同參數(shù)的函數(shù),Python會使用類內(nèi)最后一個(gè)聲明的函數(shù)。例如:
>>>class myClass: def __init__(self): pass def handle(self): print ("3 arguments") def handle(self, x): print ("1 arguments") def handle(self, x, y): print ("2 arguments") def handle(self, x, y, z): print ("3 arguments") >>> x = myClass() >>> x.handle(1, 2, 3) 3 arguments >>> x.handle(1) Traceback (most recent call last): File "<pyshell#333>", line 1, in <module> x.handle(1) TypeError: handle() missing 2 required positional arguments: 'y' and 'z'
在上面這個(gè)例子中,當(dāng)調(diào)用myClass類中的handle()函數(shù)時(shí),Python會使用有3個(gè)參數(shù)的函數(shù)handle(self, x, y, z)。所以當(dāng)只提供一個(gè)參數(shù)時(shí),Python會輸出一個(gè)TypeError的異常。
要解決這個(gè)問題,必須使用下列變通方法。在myClass類中聲明的函數(shù)名稱都不相同,但是可以利用handle()函數(shù)的參數(shù)數(shù)目,來決定要調(diào)用類中的哪一個(gè)函數(shù)。
>>> class myClass: def __init__(self): pass def handle(self, *arg): if len(arg) == 1: self.handle1(*arg) elif len(arg) == 2: self.handle2(*arg) elif len(arg) == 3: self.handle3(*arg) else: print ("Wrong arguments") def handle1(self, x): print ("1 arguments") def handle2(self, x, y): print ("2 arguments") def handle3(self, x, y, z): print ("3 arguments") >>> x = myClass() >>> x.handle() Wrong arguments >>> x.handle(1) 1 arguments >>> x.handle(1, 2) 2 arguments >>> x.handle(1, 2, 3) 3 arguments >>> x.handle(1, 2, 3, 4) Wrong arguments
- 演進(jìn)式架構(gòu)(原書第2版)
- Ceph Cookbook
- 深入理解Java7:核心技術(shù)與最佳實(shí)踐
- 假如C語言是我發(fā)明的:講給孩子聽的大師編程課
- SAS數(shù)據(jù)統(tǒng)計(jì)分析與編程實(shí)踐
- Mastering openFrameworks:Creative Coding Demystified
- C++寶典
- 從0到1:HTML5 Canvas動畫開發(fā)
- 人人都能開發(fā)RPA機(jī)器人:UiPath從入門到實(shí)戰(zhàn)
- Apache Kafka 1.0 Cookbook
- Mobile Test Automation with Appium
- TypeScript High Performance
- MonoTouch應(yīng)用開發(fā)實(shí)踐指南:使用C#和.NET開發(fā)iOS應(yīng)用
- Learning Google Apps Script
- MongoDB進(jìn)階與實(shí)戰(zhàn):微服務(wù)整合、性能優(yōu)化、架構(gòu)管理