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

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

名词解析


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




目录
打赏
0
0
0
0
1
分享
相关文章
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
321 76
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
随着数据采集需求的增加,传统爬虫工具如Selenium、Jsoup等因语言割裂、JS渲染困难及代理兼容性差等问题,难以满足现代网站抓取需求。微软推出的Playwright框架,凭借多语言支持(Python/Java/.NET/Node.js)、统一API接口和优异的JS兼容性,解决了跨语言协作、动态页面解析和身份伪装等痛点。其性能优于Selenium与Puppeteer,在学术数据库(如Scopus)抓取中表现出色。行业应用广泛,涵盖高校科研、大型数据公司及AI初创团队,助力构建高效稳定的爬虫系统。
Playwright多语言生态:跨Python/Java/.NET的统一采集方案
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
170 7
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
39 0
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
Java方法重写(Override)与重载(Overload)的详细对比
在Java编程中,多态性是面向对象编程的核心概念之一。Java通过两种重要的机制来实现多态:方法重写(Override)和方法重载(Overload)。虽然这两个概念都与方法的不同实现有关,但它们在本质上有很大的区别。本文将详细对比这两种机制,帮助开发者更好地理解和应用它们。
159 5
Python vs Java:爬虫任务中的效率比较
Python vs Java:爬虫任务中的效率比较
在比较Java和Python哪个更易学
在比较Java和Python哪个更易学
71 4