為什麼 Python 不支援函式過載?而其他語言大都支援?

時間 2021-05-06 00:30:16

1樓:jijidawang

舉個例子,C++ 中的函式過載:

void

input

(inta)

void

input

(chara)

void

input

(doublea)

Python 呢:

definput(a

):a=input

()C++:

void

helloworld

(inta=

233)

void

helloworld

(intb,

inta

,intc,

intddddd

,list

a)

template

template

...W

>void

helloworld(T

a,W...b)

因為 Python 的動態型別,所以套個預設引數就可解決問題 .

(攤手)

2樓:NaibaoOfficial

剛開始寫python,沒過載簡直不適應,我要傳個int引數,然後把他當np.ndarray處理會咋樣呢?

下回要是引數要是個figure,然後方法裡面對著他瘋狂加減乘除,哈哈哈,想都不敢想

3樓:陶世玉

人家有過載功能你就用就是了。

def max(a:str,b:str):

return max(len(a),len(b))def max(a:int,b:int):

return max(a,b)

用if,elif執行起來絕對要慢很多,如果有1000種情況,剛好你的引數排在最後一組,難道要執行前面的999種情況嗎?

4樓:zalman

唉,覺得真的沒必要,在python下邊咋談都覺得有理啦。用慣了,覺得怎麼玩都ok。

而且有或者沒有,不是從是不是能實現最終的功能上來講,而是使用的時候,看起來在某方面是不是更便利或者更容易理解或者是更不容易出錯。

為什麼那麼多語言用?肯定有他的便利的地方。你要非說,python有預設引數,那其它很多語言也有阿,也沒有就說不支援過載阿。

那你說,強型別是不是有好處,那肯定有好不好,就拿同名方法,不同型別引數來說,如果引數型別不同,你怎麼在方法中寫,才能處理不同的情況?肯定你要判斷吧,你就算接受引數的時候來者不拒,你真的以為你程式內部就來者不拒阿,隨便來什麼你程式都跑的起來啊,醒醒吧,而且這和把引數設定成object,然後在方法裡邊逐一判斷有啥區別。。。強型別會把這種判斷放到不同的同名方法裡,python之類的語言會放到同乙個方法內部,有的人覺得,不同方法裡邊,使用起來明朗和安全(比如你沒有宣告double的使用,那就別xx的給我乙個double,死一邊去,編譯丫都通不過),有的人覺得,放在同乙個方法裡邊沒有約束用的爽,這有啥爭論的。

另外再說那個不同數量的引數,噢,你覺得有預設引數,用**就解決所有了,但問題是,如同開始所說,當然可以實現(如果功能不能實現,早都沒人用了),只是有的語言,認為你這樣實現有風險,比如你怎麼管控乙個xx把你寫的引數隨便胡亂輸入,如果單純強調『能實現,所以就沒必要有』,那我覺得就有點偏激,那大家都用object作引數,什麼都解決啦,問題是這樣做,不容易理解阿,所以有些語言強調風險,有些語言強調便利,沒啥爭論不休的。

而且語言都在發展,要不出那麼多版本幹什麼,相互之間也在學習和借鑑,python作為乙個便利著稱的語言,可能在實現這些功能上面本身就不得天獨厚好麼,何必非要在各個層面都爭個贏呢。。。-_-!

5樓:

最近新學了一招,驚為天人。

用classmethod實現類似建構函式過載。

class

Overloading

(object

):def

__init__

(self,x

):self.x

=x@classmethod

defNewInit

(cls,x

,y):b

=cls(x

*y)b

.z=x

-yreturnba

=Overloading(4

)b=Overloading

.NewInit(4

,5)說實話我從來沒有想到classmethod還有這用法。

6樓:z正小歪

其實是支援的,反對樓上各種說過載沒有用的。對於 Python 這種動態語言來說(引數型別和引數個數),過載和重寫可以看做乙個東西。

我們利用過載函式這種機制的目的是用同乙個函式,來處理不同型別或者不同個數的引數。

注意重點,同乙個函式,換一句話說就是相同的函式名字。

在不使用過載的情況下,處理不同引數只能靠 if-else,這種寫法明顯很不 pythonic。

python 中 singledispatch 支援函式過載,更準確的來說是單泛函式,根據第乙個引數型別來決定使用的是哪個函式。

函式:>>>

from

functools

import

singledispatch

>>>@singledispatch

...def

fun(

arg,

verbose

=False

):...

ifverbose

:...

print

("Let me just say,"

,end

=" "

)...

print

(arg

)註冊函式:

>>>@fun

.register

(int

)...

def_

(arg

,verbose

=False

):...

ifverbose

:...

print

("Strength in numbers, eh?"

,end

=" "

)...

print

(arg

)...

>>>@fun

.register

(list

)...

def_

(arg

,verbose

=False

):...

ifverbose

:...

print

("Enumerate this:"

)...

fori

,elem

inenumerate

(arg

):...

print(i

,elem

)實現過程如下:

生成單泛函式

註冊函式

修復 MRO

呼叫註冊函式

7樓:

@functools.singledispatch(default)

Transforms a function into a single-dispatch generic function.

8樓:xy beng

[del]#像這種要怎麼搞啊?[/del]這個例子舉得不太恰當,因為python可以用類的 self.__add__ 實現

我是想說,如果是一種特殊的操作(不是add這麼簡單的,那麼要如何實現引用類內的值呢)

classA:

value=1

defadd(x

,y):pass

#如何判斷返回 x+y 還是 x.value+y.value ?a1=

A()a2=

A()add(1,

1)add(a1,a2)

9樓:

為啥不行?

def max(a,b,c='nothing'):

if c=='nothing':

if a > b:

print a

else:

print b

else:

這比重載更複雜嗎?

10樓:Rio

誰說不支援了?自己實現個簡易的 multiple dispatch 不就完了。Guido 七年前就給了範例了 [1]。同學們要多讀書,不要隨便被問題挖的坑給埋了……

靜態語言需要 function overloading 主要是為了解決呼叫靈活性的問題,Python 這麼靈活的指令碼語言用 function overloading 純屬多此一舉。

11樓:塗祺招

你錯了, 過載overload不是多型的overwrite。 過載是指用相同的函式名,但是引數列表不同(型別和個數), 是不需要虛函式也不需要額外開銷的,是在編譯期由編譯器重新命名函式。如 int f(int) , int f(float); 編譯其可能函式名變為int f_i_1(int) 和 int f_f_1(float).

指令碼語言不需要過載機制是入參本身的型別就不是確定的,既然型別可以是任意也就帶不來效能上的提高, 就無意義了。 比如python的 sub f(a): , 任意的型別都可以用來刁用f

12樓:徐凱倫

Python支援可選引數,比如

def func( a, b = 0, c = 0 ):

pass

那麼,形如func(1),func(1,2),func(1,2,3)或者func(a=1, b=2)這樣的呼叫都是合法的,這種情況下函式過載就顯得雞肋了。

個人以為,乙個語言選擇過載或者可選引數兩者中的一種就是了。像C# 4這樣同時支援這兩種形式的,就比較容易混淆。

for 迴圈為什麼不支援小數?

已登出 浮點誤差 你把中間的比較改成這樣 i 9.9 0.01 i 0 0.01 i 9.9 0.01 這樣就沒有任何問題了 除了浮點數判等誤差的原因之外,請思考下for的語義是什麼?你今天吃了三頓飯,你會不會對人描述為 第0.1頓 早飯,油條豆漿 第0.2頓 午飯,回鍋肉和公尺飯 第0.3頓 晚飯...

為什麼父母不支援穿Lolita?

SIVAN 不請自來 兩點第一 與自己審美不符合在父母眼裡女孩子要大方賢淑溫柔成熟穿lolita會顯得比較可愛有小孩子氣 第二認為花了一些不必要的錢買了一條自己不認為好看的裙子可能還有一點貴 御祁 瀉藥這題不會我爸媽支援而且幫助我一起選 任何關係都要互相理解互相包容包括親情 我媽覺得像女僕裝 而且布...

為什麼佛教不支援算命呢?

因為命可以改變,那麼只要修心就可以改變了。因為逆境順境都是可以相互轉化的,取決於人心。而算命者一般都是想著趨吉避凶,轉危為安,利用環境等外在條件 風水 等因素或自身行善等積極改變。這其實是很被動的,我們普通人做善事或者尋求改變安的是一顆功利心,大多數人心想,如果我沒有災厄要化,可能我就不需要行善積德...