Python 方法過載

ffantastic發表於2018-08-24

python的方法過載有些特殊,在python中,如下的程式碼並不能實現方法過載:

def Aa():

    pass

def Aa(a):

    print(1)

def Aa(a,b):

    print(2)

# 這裡想呼叫Aa的無引數版本,但是直譯器會報錯,提示找不到Aa方法

Aa()

 

為什麼會出現這種違法靜態語言直覺的結果?因為,在python中,方法也是attribute,方法名就是Key,所以每個方法名只能有一個方法體,以上程式碼中,當Aa被定義了多次,每一次新的定義都會覆蓋之前的定義,所以,可以在dir()中看到,Aa最終指向的函式體是Aa(a,b),但直譯器發現呼叫Aa時卻缺少兩個引數,所以會報錯。

 

在Java中,方法過載有針對兩個場景:

  1. 引數型別不同
  2. 引數個數不同

 

而Python無法在語法層面上針對第一種情況實現過載,但支援對第二種情況的過載,對應的語法就是預設引數,所以,要實現以上的過載,在pytho中應該這麼寫:

def Aa(a=1, b=1):

    print(2)


# 無引數版本

Aa()


# 一個引數版本

Aa(1)


# 兩個引數版本

Aa(1, 2)

 

那麼,如果想實現java中的這種過載需求呢:

public void Aa(int a, float b){

System.out.print(1);

}



public void Aa(float a, int b){

System.out.print(2);

}

 

python語法沒法支援,只能用程式碼邏輯上實現:

def Aa(a=1, b=1):

    if type(a) == int and type(b) == float:

        print(1)

    elif type(a) == float and type(b) == int:

        print(2)



# Aa(int,float)

Aa(1, 1.0)


# Aa(float,int)

Aa(1.0, 1)

 

相關文章