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

a3518a6324011705044a745ef398319a.gif

作者 | 苏凉.py

来源 | CSDN博客

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

8c275c3359941de1075a313dde98d966.png

类的继承

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

继承的特点

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

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

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

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

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

# 创建一个父类
class Base_father:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        print('调用了父类的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 = age
        print('调用了父类的name')


# 创建子类
class Base_son(Base_father):
    def __init__(self,name,age):
        self.name = name
        self.age = age
        print('调用了我自己定义的方法!!')


    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 = name
        self.age = age
        print('调用了父类的name')


# 创建子类
class Base_son(Base_father):
    def __init__(self,name,age):
      #利用super调用父类的构造函数
        super(Base_son, self).__init__(name ,age)
        print('-'*50)
        self.name = name
        self.age = age
        print('调用了我自己定义的方法!!')




    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 = name


    def 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 = a
        self.b =b
    def 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?

分享
点收藏
点点赞
点在看
  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python继承是面向对象编程的一种重要机制,它允许我们定义一个新,它继承了旧的所有属性和方法,并且可以在此基础上进行扩展和修改。下面是一些Python继承的知识点: 1. 语法:定义一个继承自另一个的新时,需要在新名称后面加上父名称,并用圆括号括起来,如下所示: ```python class ChildClass(ParentClass): # 子的属性和方法定义 ``` 2. 继承型:Python支持单继承和多继承。单继承指子继承一个父,而多继承则允许子继承多个父。 3. 调用父方法:在子我们可以通过super()函数来调用父方法,这样可以避免重复代码,同时也保证了子能够正确地继承的行为。 4. 方法重写:子可以重写方法,以实现自己的行为。当子定义了与父同名的方法时,它将覆盖父方法。 5. 方法重载Python不支持方法重载,即不能定义多个同名方法,只能通过默认参数或可变参数来实现似的效果。 6. 多态Python多态是基于继承方法重写实现的。如果一个子重写了父方法,那么在调用该方法时,如果对象是子的实例,那么将调用子方法,否则将调用父方法。 7. 抽象Python没有抽象的概念,但是可以通过abc模块来实现似的功能。抽象是一个不能被实例化的,它定义了一些方法,但是这些方法实现是由其子来完成的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值