1. 程式人生 > >python不支援過載函式

python不支援過載函式

注意,python是動態程式語言,因此沒有過載這個概念。這是因為形參沒有型別定義,

同名函式一旦定義,後者會覆蓋前著,也就是說:最後一次定義有效

  1 import os
  2
  3
  4 def tt(sa,sb):
  5     return sa+sb
  6
  7 def tt(sa,sb,sc):
  8     return sa-sb+sc
  9
 10
 11 if __name__=="__main__":
 12     print "this is a test on 10.58.254.50 for ssh!"
 13     num="465464"
 14     num2= "num254461"
 15     fo = open('/home/mingjian/work/resulttmp.txt','w')
 16     try:
 17        fo.write(num)
 18     finally:
 19         fo.close()
 20     print tt(1,2,3)
 21     print tt(3,4)

最後一行報錯,引數不符合。

  1. Python是動態型別語言,不能簡單地說它支援或者不支援過載,我的思考結果是,過載仍然存在,只是以不同的方式呈現。原來我們理解的過載,都是在靜態型別語言中,關心引數個數以及引數型別;在動態型別語言裡的過載根本不需要關心引數型別,只需要關心引數個數。而在Python裡,關心引數個數的過載是由預設引數和傳遞引數名稱來實現的。這樣,程式設計師就沒有必要自己來寫兩個名稱一樣而引數不同的函數了!事實上,在同一個模組或者同一個類中,寫兩個名稱相同的方法的時候(引數個數是否相同不重要),後面的那個方法會簡單覆蓋前面的方面;其次,在子類繼承父類時,同名(不同參)的方法也會簡單覆蓋(子類覆蓋父類)。但是,這不說明Python沒有過載,它只是不需要程式設計師自己來實現過載(如果說程式設計師還需要做什麼的話,那就僅僅是要定義預設引數和引數名稱)。如果你需要過載的話,”預設引數+引數名傳遞“就能達到你想要的過載了!
  2. 有貼子會說,預設引數和過載是兩回事,但是我覺得,C++裡不允許同時定義預設引數和過載函式是有道理的,Java裡乾脆取消預設引數,只有過載方法也是有道理的,這個道理,就是”預設引數和基於引數個數的過載是一回事“。只是預設引數太不好控制了,特別是遇到中間一個引數是預設引數的情況,Python提供的解決辦法是:引數名傳遞!好牛叉的思想,呵呵,從這些小細節開始喜歡Python。別具一格,又把問題解決的如此完美,這就是處處為程式設計師著想的Python!

相關推薦

python支援過載函式

注意,python是動態程式語言,因此沒有過載這個概念。這是因為形參沒有型別定義, 同名函式一旦定義,後者會覆蓋前著,也就是說:最後一次定義有效   1 import os   2   3   4

python子程序支援input函式

問題 寫多程序程式的時候,在子程序呼叫的函式內部呼叫了input函式,提示EOFError: EOF when reading a line,具體如下錯誤: 抽象出來的程式碼如下: #encoding=utf-8 from multiprocessing import Pool,P

python中子程序支援input()函式輸入

錯誤的原始碼:import socket import threading import multiprocessing # 建立socket serve_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s

PHP支援過載的解決方法

PHP不支援函式的過載,以後也不會支援在OOP中,函式的過載有兩個條件1、引數的個數不同——PHP支援引數預設,無法用引數個數區別2、引數的型別不同——PHP是弱型別語言,會根據上下文自動做型別轉換所以,PHP不可能支援函式的過載

js 寫一個函式相容 支援sort函式的的瀏覽器

var mySort = function(fn){if(typeof fn != 'function'){fn = function(a,b){return a-b;}}for(var i=1;i<this.length;i++){//var t = this[i-1];var t = this[i]

Python使用int()函式把字串轉換為數字

不使用int()函式的情況下把字串轉換為數字,如把字串"12345"轉換為數字12345。 方法一:利用str函式 既然不能用int函式,那我們就反其道而行,用str函式找出每一位字元表示的數字大寫。 def atoi(s): s = s[::-1] num

為什麼c++支援過載而C語言支援過載

學過C語言和C++的人都知道, C++支援函式過載而C語言不支援函式過載。 而所謂的函式過載就是指: 在同一作用域類,一組函式的函式名相同,引數列表不同(個數不同或型別不同),返回值可同可不同。 那麼問題來了,為什麼C++支援函式過載,而C語言不支援呢? 從程式碼的編譯到執

hadoop案例測試——pi值、wordcount函式,hadoop支援本地庫問題

前言:本文案例測試所需環境都是在前面幾篇blog的基礎上進行的,具體內容請檢視: http://blog.csdn.net/u012829611/article/details/77678609 http://blog.csdn.net/u012829611/article/deta

解析python字串型別為什麼支援改變

在C++中,如果不適用STL庫的String類,字串可以用char陣列表示: 例如:char str[5]=“absde”;//報錯,溢位,因為c++字串末尾有一個\0 應該寫成這樣char str[5]=“abcd”;//OK str[0]=‘f’;//ok 好,現在換python str

linux伺服器中支援soap及bcmul函式的結局方法

新的程式裡用了webserice介面,部到伺服器,先是提示:bcmul() 函式不可用,網上搜索一番,得知這是php的高精度函式,需要在編譯php的時候加入此模組,於是在編譯腳本里增添 “–enable-bcmath” 後重新編譯、重啟apache然後此錯誤解決; 然後有遇到報錯“Class ‘SoapCl

python 正則 換行符問題 支援(.*?)

有些換行符帶著 (.*?)匹配不到 就和很蛋疼 後來認識了\s 和\S 是完全通配的意思,\s是指空白,包括空格、換行、tab縮排等所有的空白,而\S剛好相反 這樣一正一反下來,就表示所有的字元,完全的,一字不漏的。 故而可以替換 p1 = r'(?<=<div cl

[Visual Studio C++] [MFC 除錯錯誤]:str.Format()存在與引數列表匹配的過載函式

1.編譯問題描述: str.Format(“%d”,m_number)不存在與引數列表匹配的過載函式,紅色波浪線出現在“ . ”下方 2.錯誤程式碼:                    

WIN10遠端:提示要求的函式支援

開啟WIN家庭中文版的本地組策略 1、開啟tet複製以下程式碼: @echo off pushd "%~dp0" dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-P

python 中為什麼需要過載

函式過載主要是為了解決兩個問題。 (1)可變引數型別。 (2) 可變引數個數。 另外,一個基本的設計原則是,僅僅當兩個函式除了引數型別和引數個數不同以外,其功能是完全相同的,此時才使用函式過載,如果兩個函式的功能其實不同,那麼不應當使用過載,而應當使用一個名字不同的函式。 好

遠端連線windows伺服器時提示:要求的函式支援

win10系統遠端連線windows伺服器時提示下面圖片中的問題: 解決辦法: 開啟登錄檔, 將\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parame

VS2010 / VC2010 BUG應對:to_string 過載函式完整導致編譯錯誤

按照C++11的標準,to_string函式對每個基礎算術型別均有過載函式。但是VC2010的C++庫中沒有實現所有的過載函式,而是隻實現了其中的幾個。 參見:http://connect.microsoft.com/VisualStudio/feedback/detai

出現身份驗證錯誤,要求的函式支援,導致遠端桌面無法連線的問題

首先修改加密Oracle 另把一下程式碼編輯成cmd格式的檔案後以管理員執行即可。 @echo off pushd "%~dp0" dir /b C:\Windows\servicing\Packages\Microsoft-Windows-Gro

selenium3 python 火狐瀏覽器 呼叫函式quit()函式後,瀏覽器關閉,geckorderiver退出

環境: win10+selenium3+python3+火狐瀏覽器54 問題描述:呼叫函式quit()後瀏覽器關閉,但geckorderiver不退出,此時自動化測試流程卡住,沒有報錯,手動關閉geckorderiver流程可以正常繼續。 問題原因:經過多次實驗,發現該問題

疑問:Python跨模組呼叫函式時,被呼叫函式內部能使用全域性變數

簡單案例: 模組1中的函式 def add(): print(a) if __name__=='__main__': a=10 add()  模組2中的函式 from 模組1 import add a=20 add()

sublime python mac支援中文解決辦法

1. Tools -> Build System -> New Build System 2. 取名 PythonZH.sublime-build 3. 編輯 Pythonzh.sublime-build,輸入: {     "env": {"LANG":