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
    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)

你可能感兴趣的:(pyqt)