Python 方法重载

发布时间:2019-09-15 10:14:59编辑:auto阅读(1498)

    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)

     

关键字