美文网首页
你知道Java的重写与重载,在Python中该如何实现吗?

你知道Java的重写与重载,在Python中该如何实现吗?

作者: 清风Python | 来源:发表于2020-04-12 05:16 被阅读0次

名词解析

Java中重写与重载的含义:

重写(Override), 是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!
重载(overloading), 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
参考:https://www.runoob.com/java/java-override-overload.html

可是在Python中,这两种实现却被模糊化了。大家通常更多听到的是只有重载的概念,而Python的重载却更像是Java的重写,具体内容如下:

重载是对继承的父类方法进行重新定义。
重载可以重新定义方法还可以重新定义运算符。
因为通过继承的类不一定能满足当前类的需求。
在当前类中只需要修改部分内容而达到自己的需求。

再仔细一点说,python将重载又分为了类的重载,运算符重载(一些内置魔术方法的二次定义)。

类的重载与运算符重载

类的重载和运算符重载网上铺天盖地的内容,谁也说不出个花来,但既然提到了,就简单举个例子吧...

类的重载是子类继承父类,并重写了父类的方法,比如:

# 类的重载
class Person:
    def __init__(self, age, sex):
        self._age = age
        self._sex = sex

    def say(self):
        print("欢迎关注 [清风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 男
欢迎关注 [清风Python] 公众号

子类WangPangZi不仅继承了父类的say方法,另外重写了call方法,用于专门打印出自己低调而不失内敛的名字,这就是最近简单的类的重载。

运算符重载和上面的类似,只不过它是将原本一些运算符的功能进行了重新定义,举例说明:

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如何实现java的重载功能呢?

Java的重载实现

首先要明确java重载涉及哪些:

  1. 参数个数不同,这个在Python真比较容易实现,我们可以通过Python默认参数与可变长参数来实现,举个例子:
def eg1(name, hobby='Python'):
    print("{}的是{}开发".format(name, hobby))

eg1('老王')
eg1('老张', 'Java')

output:
老王的是Python开发
老张的是Java开发

2.参数相同,但入参的类型不同,此时该如何操作呢?简单一思考,貌似Python没办法实现,但是如果基础够扎实的同学,应该听过functools中有一个singledispatch 装饰器。让我们来看看它的具体实现吧!

from functools import singledispatch

@singledispatch
def shop(price):
    pass

@shop.register(int)
def int_price(price):
    print('获取整数单价%s' % price)

@shop.register(float)
def float_price(price):
    print('获取小数单价%s' % price)

if __name__ == '__main__':
    shop(100)
    shop(99.8)

output:
获取整数单价100
获取小数单价99.8

如此操作,就达到了类似Java中的重载功能...当然这个装饰器也是有弊端的,它只能根据第一个参数的类型去决定调用那个函数...

语言之间的对比

不同的语言比较着去学习,是否觉得更加有趣了?下次面试,如果考官问你这些,岂不是稳稳通过!今天的内容就到这里,希望大家喜欢。

The End

期待你关注我的公众号清风Python,如果你觉得不错,希望能动动手指转发给你身边的朋友们。

相关文章

  • 你知道Java的重写与重载,在Python中该如何实现吗?

    名词解析 Java中重写与重载的含义: 重写(Override), 是子类对父类的允许访问的方法的实现过程进行重新...

  • Java重写和重载的知识点(广州中软卓越)

    在学习广州中软卓越Java培训课程中,我们会遇到一些关于java重载与重写的问题:Java中重载与重写有何重要性?...

  • java分派!

    Java的重载和重写在开发中是非常常见的,那么它们在Java虚拟机中是如何实现的?先看下Java的两种分派方式:静...

  • java面试题

    重载和重写 引用深入理解Java中的重写和重载 重写的条件 参数列表必须完全与被重写方法的相同;返回类型必须完全与...

  • JAVA基础之重写和重载

    重写和重载详细区分: Java 重写(Override)与重载(Overload) | 菜鸟教程 核心区分:重写(...

  • Python 重写与重载

    1、前言 学过Java的朋友都知道,Java有重写与重载的概念,那么Python语言有没有这种概念呢?首先来了解一...

  • Java重写和重载

    本文参考菜鸟驿站Java 重写(Override)与重载(Overload) 重写(Override) 重写指子类...

  • Java 重写(Override)与重载(Overload)

    Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问...

  • JAVA

    JAVA java中接口与抽象类的区别? 简述jvm的内存布局? java对象创建的过程? java重载与重写的区...

  • JVM方法调用

    方法重载和方法重写多态是面向对象程序设计的重要特性,方法重载和方法重写是Java语言实现多态的主要形式。方法重载指...

网友评论

      本文标题:你知道Java的重写与重载,在Python中该如何实现吗?

      本文链接:https://www.haomeiwen.com/subject/trbmmhtx.html