Python爬虫、数据分析与可视化:工具详解与案例实战
上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库的诸多方法里就包含了不少可变参数,以此体现功能相同但细节不同的多态特性。