上QQ阅读APP看书,第一时间看更新
3.4.2 可变参数与方法重载
多态的表现形式是动作相同但具体实现细节不同,而具体的实现细节一般体现在参数列表里,比如对于同一类printInfo打印信息的方法,可以通过不同的参数列表来实现不同的打印逻辑。
在Java等语言里,支持两个方法同名但参数个数不同的情况,这种情况叫方法重载,但是Python不支持重载方式。为了在Python里通过方法重载而实现多态,我们可以使用可变参数。在如下的MoreParamDemo.py案例中,我们将演示通过可变参数实现方法重载的做法。
01 # coding=utf-8 02 class PrintTool: 03 def printInfo(self): 04 print('Print in default mode.') 05 # def printInfo(self,modeName): 06 # print('Print in '+modeName+ ' mode.') 07 def printWithParam(self,*args): 08 print(args) 09 def printWithDict(self, **kwargs): 10 print(kwargs) 11 tool = PrintTool() 12 tool.printWithParam('No.123','A4') # ('No.123', 'A4') 13 # ('No.123', 'A4', 'Now') 14 tool.printWithParam('No.123','A4','Now') 15 tool.printWithDict(printNo='No.123',printMode='A4') # {'printNo': 'No.123', 'printMode': 'A4'} 16 # {'printNo': 'No.123', 'printMode': 'A4', 'printTime': 'Now'} 17 tool.printWithDict(printNo='No.123',printMode='A4',printTime='Now')
在第2行定义的PrintTool类里,我们在第3行和第5行定义了两个同名的printInfo方法,但是它们的参数个数不同,这种做法在调用方法时会出现语法问题。
在第7行定义的printWithParam方法里,它的参数是*args,属于可变参数,在调用时,对应的参数以元组的形式存储在args里。比如在第12行和第14行调用该方法时,传入的参数个数不同,但是不同个数的参数都存储在args里,从这两行的打印结果能确认这一点。
也就是说,Python以这种可变参数的形式实现了方法的重载,具体在调用时,可以针对具有相同逻辑作用的同名方法传入不同的参数,以区分实现的细节,从而实现多态特性。
以一个星号(*)表示的可变参数属于元组类型,而以两个星号(**)表示的可变参数属于字典类型,比如在第9行定义的printWithDict方法里包含了字典类型的可变参数。在第15行和第17行调用该方法时以字典的形式传入不同的参数,由此实现了重载,从而体现多态特性。
像此类元组和字典类型的可变参数,在之后提到的第三方库里会大量出现,比如提供可视化功能的Matplotlib库的诸多方法里就包含了不少可变参数,以此体现功能相同但细节不同的多态特性。