1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        你知道Java的重寫與重載,在Python中該如何實(shí)現(xiàn)嗎?

        共 2359字,需瀏覽 5分鐘

         ·

        2020-04-13 23:24

        1


        名詞解析


        Java中重寫與重載的含義:

        重寫(Override), 是子類對父類的允許訪問的方法的實(shí)現(xiàn)過程進(jìn)行重新編寫,返回值和形參都不能改變。即外殼不變,核心重寫!
        重載(overloading), 是在一個類里面,方法名字相同,而參數(shù)不同。返回類型可以相同也可以不同。
        參考:https://www.runoob.com/java/java-override-overload.html

        可是在Python中,這兩種實(shí)現(xiàn)卻被模糊化了。大家通常更多聽到的是只有重載的概念,而Python的重載卻更像是Java的重寫,具體內(nèi)容如下:

        重載是對繼承的父類方法進(jìn)行重新定義。
        重載可以重新定義方法還可以重新定義運(yùn)算符。
        因?yàn)橥ㄟ^繼承的類不一定能滿足當(dāng)前類的需求。
        在當(dāng)前類中只需要修改部分內(nèi)容而達(dá)到自己的需求。

        再仔細(xì)一點(diǎn)說,python將重載又分為了類的重載,運(yùn)算符重載(一些內(nèi)置魔術(shù)方法的二次定義)。

        1


        類的重載與運(yùn)算符重載


        類的重載和運(yùn)算符重載網(wǎng)上鋪天蓋地的內(nèi)容,誰也說不出個花來,但既然提到了,就簡單舉個例子吧…

        類的重載是子類繼承父類,并重寫了父類的方法,比如:

        # 類的重載
        class?Person:
        ????def?__init__(self, age, sex):
        ????????self._age = age
        ????????self._sex = sex

        ????def?say(self):
        ????????print("歡迎關(guān)注 [清風(fēng)Python] 公眾號")

        ????def?call(self):
        ????????print("This Person age {_age},sex {_sex}".format(**self.__dict__))


        class?WangPangZi(Person):
        ????def?__init__(self, name, age, sex):
        ????????super().__init__(age, sex)
        ????????self._name = name

        ????def?call(self):
        ????????print("This Person name {_name},age {_age},sex {_sex}".format(**self.__dict__))

        P= Person(18, '女')
        P.call()

        W = WangPangZi('王胖子', 30, '男')
        W.call()
        W.say()

        output:
        This Person age 18,sex 女
        This Person name 王胖子,age 30,sex 男
        歡迎關(guān)注 [清風(fēng)Python] 公眾號


        子類WangPangZi不僅繼承了父類的say方法,另外重寫了call方法,用于專門打印出自己低調(diào)而不失內(nèi)斂的名字,這就是最近簡單的類的重載。

        運(yùn)算符重載和上面的類似,只不過它是將原本一些運(yùn)算符的功能進(jìn)行了重新定義,舉例說明:

        class?NewList:
        ????def?__init__(self, *args):
        ????????self._list = []
        ????????for?i in?args:
        ????????????self._list.append(i)

        ????def?__add__(self, other):
        ????????self._list = [i + other for?i in?self._list]

        ????def?call(self):
        ????????print(self._list)


        N = NewList(1, 2, 3, 4, 5)
        N + 10
        N.call()

        output:
        [11, 12, 13, 14, 15]

        python的重載(即Java的重寫)說完了,但python如何實(shí)現(xiàn)java的重載功能呢?

        1


        Java的重載實(shí)現(xiàn)


        首先要明確java重載涉及哪些:

        1.參數(shù)個數(shù)不同,這個在Python真比較容易實(shí)現(xiàn),我們可以通過Python默認(rèn)參數(shù)與可變長參數(shù)來實(shí)現(xiàn),舉個例子:

        def?eg1(name, hobby='Python'):
        ????print("{}的是{}開發(fā)".format(name, hobby))

        eg1('老王')
        eg1('老張', 'Java')

        output:
        老王的是Python開發(fā)
        老張的是Java開發(fā)

        2.參數(shù)相同,但入?yún)⒌念愋筒煌?,此時該如何操作呢?簡單一思考,貌似Python沒辦法實(shí)現(xiàn),但是如果基礎(chǔ)夠扎實(shí)的同學(xué),應(yīng)該聽過functools中有一個singledispatch 裝飾器。讓我們來看看它的具體實(shí)現(xiàn)吧!

        from?functools import?singledispatch

        @singledispatch
        def?shop(price):
        ????pass

        @shop.register(int)
        def?int_price(price):
        ????print('獲取整數(shù)單價%s'?% price)

        @shop.register(float)
        def?float_price(price):
        ????print('獲取小數(shù)單價%s'?% price)

        if?__name__ == '__main__':
        ????shop(100)
        ????shop(99.8)

        output:
        獲取整數(shù)單價100
        獲取小數(shù)單價99.8

        如此操作,就達(dá)到了類似Java中的重載功能…當(dāng)然這個裝飾器也是有弊端的,它只能根據(jù)第一個參數(shù)的類型去決定調(diào)用哪個函數(shù)。


        1


        語言之間的對比


        不同的語言比較著去學(xué)習(xí),是否覺得更加有趣了?下次面試,如果考官問你這些,豈不是穩(wěn)穩(wěn)通過!今天的內(nèi)容就到這里,希望大家喜歡。

        好文章,我在看??

        瀏覽 134
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            黄片操逼软件 | 精品无码一区二区三区天香 | 中文字幕免费视频二三回五区 | 欧老太做爰 亚洲性猛交 | 真人看一级毛片 | 国产激情视频网 | 97超碰免费 | 黄片视频免费在线播放 | 久久精品久久久精品美女 | 女明星疯狂高潮呻吟摸揉 |