python--继承和多态

本文介绍了Python中的面向对象特性,包括继承的概念、单继承、方法重写、多继承以及多态。详细讲解了如何通过继承实现代码重用,如何重写父类方法以满足子类需求,以及多继承时的方法解析顺序(MRO)。同时阐述了多态的原理和应用场景,展示了如何通过多态提高代码灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承

面向对象三大特性:
1、封装:根据职责将属性和方法封装到一个抽象的类中。
2、继承:实现代码的重用,相同的代码不需要重复编写。
3、多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度。

单继承

继承的概念:子类拥有父类的所有方法和属性。

继承的语法:

class 类名(父类名)pass

继承也叫做派生父类被称为基类子类被称为派生类

继承的传递性:
子类能继承父类的方法,也能继承爷类的方法,但是不能继承叔类的方法。
在这里插入图片描述

方法的重写

当父类的方法不能满足子类的需求时,可以对方法进行重写,在子类中定义一个和父类同名的方法并且实现。即可覆盖父类方法。如果父类原本封装的方实现是子类的方法的一部分,那么久可以对父类的方法进行扩展。在子类中重写父类方法,并且在需要位置使用super().父类方法来调用父类方法的执行。

在python中super是一个特殊的类,super()就是使用super类创建出来的对象。

class Dog:
	def bark(self):
		print("汪汪叫")


class XiaoTianQuan(Dog):
	def bark(self):
		print("像神一样叫唤")
		super().bark()
		

xtq = XiaoTianQuan()

还有一种不推荐的方式调用父类方法:

父类名.方法(self)
Dog.bark(self)

子类对象不能在自己的方法内部,直接访问父类的私有属性或私有方法。
子类对象可以通过父类的公有方法简介访问到私有属性或私有方法。

多继承

子类可以拥有多个父类。
在这里插入图片描述
语法格式:

class 子类名(父类1, 父类2...)
	pass

在使用多继承时,应该避免不同父类之间存在同名的属性或者方法。

MRO:methond resolution order. 主要用于在多继承时判断 属性或者方法 的调用路径。有一个内置属性__mro__可以查看方法搜索顺序。

print(类名.__mro__)

一般是就近原则。

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

object是python为所有对象提供的基类,提供了一些内置的属性和方法,可以使用dir函数查看。

python3中定义类时,如果没有指定父类,会默认使用object作为该类的基类,在python2中则不同。使用object作为基类的是新式类,不以object作为基类的是经典类。推荐在定义类的时候,如果没有父类,统一继承自object类。

class 类名(object)pass

多态

多态:不同的子类对象调用相同的父类方法,产生不同的执行结果。

多态以继承重写父类方法为前提,可以增加代码的灵活度。

比如做如下封装:

class Dog(object):
    def __init__(self, name):
        self.name = name

    def play_game(self):
        print("%s蹦蹦跳跳的玩耍" % self.name)


class XiaoTianQuan(Dog):

    def play_game(self):
        print("%s飞到填上去玩耍" % self.name)


class Person(object):
    def __init__(self, name):
        self.name = name

    def game_with_dog(self, dog):
        print("%s和%s一起玩耍" % (self.name, dog.name))
        dog.play_game()

通过不同的调用,可以实现人和普通的狗或者哮天犬玩耍。

wangcai = Dog("旺财")
xiaoming = Person("小明")
xiaoming.game_with_dog(wangcai)

结果如下:

小明和旺财一起玩耍
旺财蹦蹦跳跳的玩耍

而如果使用子类生成神犬:

xtq = XiaoTianQuan("哮天犬")
erlangshen = Person("二郎神")
erlangshen.game_with_dog(xtq)

则结果如下:

二郎神和哮天犬一起玩耍
哮天犬飞到填上去玩耍

因为父类和子类虽然方法名相同,但是方法的实现内容却不同,所以可以通过父类或者子类生成不同的对象,使用同样的方法,实现不同的功能。

Person类中只需要让狗对象调用game方法,而不关心具体是什么狗,在程序执行时,传入不同的狗对象实参,就会产生不同的执行结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值