首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

再谈继承,Python里有什么不同以及多态

一、继承:

继承(Inheritance)我叫小王,我爸是大王。继承的本质是个性对共性的属性与方法的接收,并加入个性特有的属性与方法。

一个类继承另一个类,则称继承的类为子类、派生类、衍生类,被继承的类为父类、基类。通过继承实现代码的复用,达到延续和扩展父类信息。继承后子类自动拥有了父类的属性和方法,子类根据需要新增和重写自己特有的属性和方法,实现功能的扩展。

1、理解

继承的本质在于抽象。类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。同时使用继承可以提高代码的复用性。(事实上,利用组合可以更好的实现代码复用!)

运行结果:

2、判断子类

使用issubclass(cls, A_tuple)判断是否为某一个类的子类,其中cls 就是要判断的是否为A_tuple中类的衍生类或者同类,A_tuple可以是一个元组,也可以是一个元素,为父类的元组,A_tuple中有一个类是cls的父类则返回True。

3、私有信息访问限制

如果子类方法想要访问父类的私有属性和方法时,是不能直接访问的,只能通过调用父类方法访问

4、方法重写

方法重写就是当父类的方法不能满足业务时,就可以通过子类重写父类的方法达到效果,而不需要修改父类方法。在Python中重写就是覆盖父类方法,那么我们在调用时都会遵循就近原则。

Son类重写了Father的eat方法,当main方法调用eat方法时,会优先考虑自己本类的方法,如果没有才会去寻找父类方法。如:

二、多态

多态(polymorphism)是很多面向对象编程语言的重要特性,尽管我们的python语言中没有多态这一特性,但是不影响我们对这一特性的了解。不要叹息,我们的python语言特价灵活,有更加灵活的鸭子模型。要是我对你说今天会有好事发生。我并没有说好事是什么,这个好事就是模糊的,究竟是什么好事呢?就是今天我们就会将继承、封装、鸭子模型三大特性斩获囊中。

电脑上的USB接口,就是一个多态,凡是实现了这个接口的电子产品如u盘、打印机、手机都可以与电脑对接,在python中,多态更加灵活,只需要一个对象“看起来像鸭子,走起路来像鸭子,那它被认定是只鸭子”即经典的鸭子模型。

1、理解

在同一个方法中,参数不同导致结果不同的现象叫多态。比如定义一个鸟类,在定义百灵鸟类和鹦鹉类,然后在重写fly方法。定义一个方法,如果传入的是百灵鸟类就会打印百灵鸟的fly方法,如果传入鹦鹉打印鹦鹉的fly方法。

2、实例

王大锤有一个车库,里面有两种车,奔驰和奥迪,那他具体开哪辆呢,就是要到时开车方法里面传入的是什么车,那就开什么车

3、鸭子模型

因为Python是弱类型语言,所以它的多态和其他面向对象语言比如Java不一样,在Java中实现多态必须使用继承,不然编译就会出现类型不符合,而Python本身不会出现这样的情况,因此在实现多态时,并不一定要使用继承,比如刚刚品酒的例子进行修改:

鸭子模型是动态语言的一个特点,意思就是一个对象“看起来像鸭子,走起路来像鸭子,那它被认定是只鸭子”, 就像刚刚品酒,我定义的MaoTai、WuLiangYe、JianNanChun并不需要集成Wine类,只需要在它们三个类中有一个show_ad的方法,那么在Person类中的drink()方法就可以传入这三个不同的类也能达到打印不同的广告词的效果。这个在静态语言中是没法完成的,因为静态语言对参数的类型有严格的限制。也就是讲动态类型语言的变量或者参数不需要声明的原因,都只需要在运行时校验。

4、super()

上面讲到了重写,子类会覆盖父类的方法,但如果你一定要调用父类方法时,怎么办呢?就使用super()调用

继承字典类:

来个复杂点的例子:

最后,奉上视频

继承的理解

多态的理解

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190422A0LPFA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券