你知道Java的重寫與重載,在Python中該如何實(shí)現(xiàn)嗎?
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)容就到這里,希望大家喜歡。
好文章,我在看??
