python中的__init__函数重载与覆盖问题

python中的init函数重载与覆盖问题

先看一段代码,利用重载特性实现了多个init函数。

# coding:utf-8

urlHk = 'http://apis.baidu.com/apistore/stockservice/hkstock?stockid=%s&list=1'
urlSh = 'http://apis.baidu.com/apistore/stockservice/stock?stockid=sh%s&list=1'
urlSz = 'http://apis.baidu.com/apistore/stockservice/stock?stockid=sz%s&list=1'

stockTypeDic = {
    'hk': urlHk, 'sh': urlSh, 'sz': urlSz}
stockIdHeadDic = {
    '0': 'sz', '6': 'sh'}


class MakeUrl(object):
    print ('makeurl')

    def __init__(self):
        self.url = urlSh

    def __init__(self, stockid):
        self.putStockId(stockIdHeadDic[str(stockid)[0]], stockid)

    def __init__(self, stockType, stockid):
        self.putStockId(stockType, stockid)

    def putStockId(self, stockid):
        self.url = 'http://apis.baidu.com/apistore/stockservice/hkstock?stockid=%s&list=1' % (stockid)

    def putStockId(self, stockType, stockid):
        self.url = stockTypeDic[stockType] % (stockid)

实际调用时编译器却报了错,调用代码如下

urlMaken = GetStockInfo.MakeUrl('601668')

报错如下:

  File "/usr/local/workspace/pycharmPro/NetDataApiLab.py", line 11, in <module>
    urlMaken = GetStockInfo.MakeUrl('601668')
TypeError: __init__() takes exactly 3 arguments (2 given)

意思是init函数需要3个参数,但是自己却只给了2个
由于偶是学c++的 我想起自己c++编程时多个构造函数是没有问题的。
后来想了想又突然明白了 python中没有switch语句 为了发挥灵活性 多用字典来代替
同样 为了保持代码的简洁 构造函数也只有一个 参数列表最长的一个覆盖其他的构造函数
当需要实现变长参数个数时 采用默认值来实现 也即同名的函数只需要一个就够了 python代码确实简洁
不过缺点是编译时如果没有调用 纵然定义了多个重载函数也不会报错 只有当调用参数较少重载函数时才会报出来
修改后代码如下

class MakeUrl(object):
    print ('makeurl')

    def __init__(self, stockid, stockType='sh'):
        self.putStockId(stockIdHeadDic[str(stockid)[0]], stockid)

    def putStockId(self, stockType, stockid):
        self.url = stockTypeDic[stockType] % (stockid)

不得不惊叹python在简洁完美的同时又具有强大的功能
:)
生活如果不是一场勇敢的冒险就什么也不是

你可能感兴趣的:(python,函数重载,函数覆盖,多个构造函数,百度api)