在 Python 中如何实现类的继承,方法重载及重写?

news/2024/7/2 23:04:56

a3518a6324011705044a745ef398319a.gif

作者 | 苏凉.py

来源 | CSDN博客

今天我们将进入类的继承以及对类的方法重写及重载的学习!话不多说直接进入正题!!

8c275c3359941de1075a313dde98d966.png

类的继承

如果要编写的类是另一个现成类的特殊版本,那我们就可以使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法,原有的类称为父类,而新的类称为子类,子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法。

继承的特点

  • 如果在子类中需要父类的构造方法就需要调用父类的构造方法,或者不重写父类的构造方法。

  • 在调用父类的方法时,需要加上父类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数。

  • Python 总是首先查找对应类型的方法,如果它不能在子类中找到对应的方法,它才开始到父类中逐个查找。(先在子类中查找调用的方法,找不到才去夫类中找)。

子类不重写__ init __ 的继承(子类需要自动调用父类的方法)

子类不重写 __ init __,实例化子类时,会 自动调用父类定义的 __ init __。

# 创建一个父类
class Base_father:def __init__(self,name,age):self.name = nameself.age = ageprint('调用了父类的name')# 创建子类
class Base_son(Base_father):def getname(self):print(f'姓名:{self.name}')print(f'年龄:{self.age}')return '运行完毕!!'num1 = Base_son('suliang',21)
print(num1.getname())

运行结果:

e6badabad04aa70af503b75616f70b37.png

在子类中没有重写 __ init __方法,在调用子类进行实例化时,就默认调用父类的 __ init __ 方法。

子类重写__ init __ 的继承(子类不需要自动调用父类的方法)

如果重写了__ init __ 时,实例化子类,就不会调用父类已经定义的 __ init __。

# 创建一个父类class Base_father:    def __init__(self,name,age):        self.name = name        self.age = ageprint('调用了父类的name')# 创建子类
class Base_son(Base_father):def __init__(self,name,age):self.name = nameself.age = ageprint('调用了我自己定义的方法!!')def getname(self):print(f'姓名:{self.name}')print(f'年龄:{self.age}')return '运行完毕!!'num1 = Base_son('suliang',21)
print(num1.getname())

运行结果:

a61cfe6f10d7d8863da6c32f4f664f13.png

通过上面两个例子就可以清楚的看到,若是子类自己定义了一个初始化方法 __ init __,那么将不在调用父类已经调用好的 __ init __ 方法。

子类重写 __init __ ,并且继承父类的构造方法(super)

如果重写了__ init __ 时,要继承父类的构造方法,可以使用 super关键字。
语法:super(子类,self).__ init __(参数)
# 创建一个父类
class Base_father:def __init__(self,name,age):self.name = nameself.age = ageprint('调用了父类的name')# 创建子类
class Base_son(Base_father):def __init__(self,name,age):#利用super调用父类的构造函数super(Base_son, self).__init__(name ,age)print('-'*50)self.name = nameself.age = ageprint('调用了我自己定义的方法!!')def getname(self):print(f'姓名:{self.name}')print(f'年龄:{self.age}')return '运行完毕!!'num1 = Base_son('suliang',21)
print(num1.getname())

运行结果:

e737686918905296d87d6ec132d7fd68.png

81bdfafe1df2d0f518f84458c8beee4b.png

方法的重写及重载

重写

子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。

优点:子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。

重载

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

二者区别

  1. 方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载。

  2. 方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写。

  3. 方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

对方法重写

如果父类方法的功能不能满足你的需求,就可以在子类重写你父类的方法。

class Father:def __init__(self,name):self.name = namedef list(self):print(f'name:{self.name}')class Son(Father):def list(self):print(f'姓名:{self.name}')return  '执行完毕!!'num1 = Son('suliang')
print(num1.list())

运行结果:

512c07ca4a44113301f6103db46d40bc.png

基础重载方法

  • 构造函数

__ init __ ( self [,args] )

  • 析构方法,删除一个对象

__ del __( self )

  • 转化为供解释器读取的形式

__ repr __( self )

  • 用于将值转化为适于人阅读的形式

__ str __( self )

  • 对象比较

__ cmp __ ( self, x )

方法重载的具体方法将在下一章进行详细介绍。在此之作简单说明!!

d30637236f0055d738152286ffaa34e4.png

类的属性和方法()

类的私有属性

在定义类的属性时,在前面加入__(两个下划线)即代表私有属性,只能在类的内部调用,而不能在外部调用。

class List:a = 5 #类的公有属性__b = 6 #类的私有属性obj = List()
print(obj.a)
print(obj.__b)

运行结果:

88cb5871cfaf562ea60613cab1ce2260.png

类的私有方法

在定义方法时,在前面加入 __ (两个下划线)即可定义一个私有方法,只能在类的内部调用,语法为self.__方法名

class List:def __init__(self ,a,b ):self.a = aself.b =bdef pri1(self):# 定义一个公有方法print(f'{self.a + self.b}')return '  'def __pri2(self):# 定义一个私有方法print(f'{self.a *self.b}')def pri3(self):self.__pri2()  # 在内部调用私有方法return '  'obj = List(5,10)
print(obj.pri1())
print(obj.pri3())

运行结果:

35ea787a1e2739ff2e16501b24529ea6.png

1b5e095b3f4ee57afe1ccf04d353f801.png

面向对象中下划线的说明

_前面单下划线

以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问。

_前面双下划线

双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

_前面双下划线_

定义的是特殊方法,一般是系统定义名字 ,类似 __ init __() 之类的。

d67b91f9d7ef9f46256832c03455a348.png

小结

本篇文章带大家了解了类的继承,方法的重写以及重载的内容。一顿操作下来是不是觉得并不难呢,当然这都是基础语法,深入的还需大家理解这其中的内涵,再慢慢的去实践。

26064ccf07789f18fc960a7da28a03e9.gif

往期回顾

介绍Pandas实战中的一些高端玩法

从Python可视化图表中探究王心凌的流量密码

Python 实现 GIF 动图以及视频卡通化

如何用一行Python代码制作一个GUI?

分享
点收藏
点点赞
点在看

http://lihuaxi.xjx100.cn/news/254293.html

相关文章

是时候了解下 mmap 了

欢迎关注方志朋的博客,回复”666“获面试宝典作者:逗逼程序员链接:https://www.jianshu.com/p/0ce91e10d0261、mmap基础概念mmap 是一种内存映射文件的方法,即将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘…

2018 蓝桥杯省赛 B 组模拟赛(一)-年龄

今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”。 花椰妹看大家一脸懵逼,就知道大家也不…

Numpy入门教程:04. 数学函数

背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

PHP生成PDF文档的FPDF类

以前在PHP4的早期版本中用PDFlib生成PDF文档比较容易,现在升级到PHP5了,发现更麻烦了,装的PHP 5.2.4默认没有PHPlib,从php.net上找了一个,装上竟一直报错,开始以为是版本兼容问题,后来在租来的服…

Gartner发布:2023年十大重要技术趋势

Datawhale干货 发布:Gartner,方向:技术趋势前言Gartner是全球领先的信息技术研究和咨询公司。日前,Gartner发布企业机构在2023年需要探索的十大战略技术趋势。Gartner杰出研究副总裁Frances Karamouzis表示:“为了在经…

ISA---不能访问网址或是多次刷新才能访问的解决方法一则

当你安装ISA2006在WINDOWS 2003 SERVER上,并打上SP2补订时。遇SNAT客户端不能访问WEB,但能PING通,能TELNET通,也能访问QQ或是MSN的问题时可以利用以下方法解决。同时,如果你遇到在此环境下,客户端访问外部网…

Pandas 表格样式设置指南,看这一篇就够了!

作者 | 阳哥来源 | Python数据之道最近这些年,Python在数据分析以及人工智能领域是越来越火。这离不开pandas、numpy、sklearn、TensorFlow、PyTorch等数据科学包,尤其是 Pandas,几乎是每一个从事Python数据科学相关的同学都绕不过去的。Pand…

PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树

1132 Cut Integer(20 分) 题意:将一个含K(K为偶数)个数字的整数Z割分为A和B两部分,若Z能被A*B整除,则输出Yes,否则输出No。 分析:当A*B为0的时候,不能被Z整除…