python之面向对象中的多态
直接看代码:
class Dog:
def __init__(self,name):
self.name = name
def play(self):
print("%s在汪汪汪" % self.name)
class SonDog(Dog):
def play(self):
print("%s不仅会汪,还会飞" % self.name)
class Person:
def __init__(self,name):
self.name = name
def game(self,dog):
print("%s正在和%s快乐地做游戏" % (self.name,dog.name))
dog.play() wc = Dog("旺财")
p = Person("妞妞")
p.game(wc)
输出:

说明:SonDog继承了Dog,并重写了play方法 。在Person类中,game方法需要传入一个Dog的实例。
假设我们传给game的不是Dog类,而是其子类,那么效果又是怎么样的呢?
# wc = Dog("旺财")
sonWc = SonDog("旺财儿子")
p = Person("妞妞")
p.game(sonWc)
输出:

我们发现,调用的是子类的play方法。
在python中,多态体现得没那么明显。我们可以将其展开来看。python是一门动态语言,不需要指定变量的类型,会在运行阶段自动判别变量的类型。因此,对于某个类而言,在实例化时,不需要指定它是什么类,比如说在java中有Dog这么一个类,在新建它的实例时,都会使用Dog dog = new Dog(),而在python中只需要dog = Dog()。 而所谓的多态,就是父类的引用指向子类的对象,拿java举例:SonDog继承了Dog,在实例化时Dog dog = new SonDog(),这就体现了一种多态性。为什么这么说?假设有多个不同的子类继承了该类,那么,该父类的引用指向不同子类的实例,就可以实现不同的功能。这就是多态的思想。
再拿本段代码而言,在Person类中的game方法,需要传入的是一个Dog对象(python并不用显示的指定它的类型),当传入wc时很好理解,但是,为什么还可以传入sonWc?之前也说过了,可以这么理解:Dog sonWc = new SonDog("旺财儿子"),这不就是父类的引用指向子类的对象了么。子类重写了父类的play方法,在调用时,会调用子类的play方法。
那么,假设父类中有而子类没有,子类中有而父类中没有的方法会怎么样呢?
class Dog:
def __init__(self,name):
self.name = name
def play(self):
print("%s在汪汪汪" % self.name)
def test1(self):
print("父类的test1方法")
class SonDog(Dog):
def play(self):
print("%s不仅会汪,还会飞" % self.name)
def test2(self):
print("子类的test2方法")
class Person:
def __init__(self,name):
self.name = name
def game(self,dog):
print("%s正在和%s快乐地做游戏" % (self.name,dog.name))
dog.play()
dog.test1()
dog.test2() # wc = Dog("旺财")
sonWc = SonDog("旺财儿子")
p = Person("妞妞")
p.game(sonWc)
输出:

假设,我们传入的就是父类的实例:
wc = Dog("旺财")
# sonWc = SonDog("旺财儿子")
p = Person("妞妞")
p.game(wc)
输出:

父类就访问不到子类的特有的方法。
讲这么一个是为了说明什么,多态使得父类可以访问到子类的方法和属性,虽然在python中并不显得那么明显。
总结:
- 本文通过例子讲述了python中的多态:父类的引用指向子类的对象。
- 另外,像方法的重写和重载也是多态的一种体现。
python之面向对象中的多态的更多相关文章
- JAVA 面向对象中的多态
多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...
- Python入门-面向对象三大特性-多态
Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型".
- 设计模式-Template(行为模式) 采用 继承的方式 将算法封装在抽象基类中,在子类中实现细节。利用面向对象中的多态实现算法实现细节和高层接口的松耦合。
以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Template.h class AbstractClass { public: virtual ~AbstractCla ...
- python面向对象(封装、多态、反射)
目录 面向对象之封装 @property 面向对象之多态 面向对象之反射 面向对象之封装 含义 将类中的某些名字按照特殊的书写方式"隐藏"起来,不让外界直接调用,目的是为了不然外界 ...
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- java中实现多态的机制是什么?
多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...
- c++中的多态机制
目录 1 背景介绍 2 多态介绍 2-1 什么是多态 2-2 多态的分类 2-3 动态多态成立的条件 2-4 静态联编和动态联编 2-5 动态多态的实现原理 2-6 虚析构函数 ...
- Python面向对象中的继承、多态和封装
Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...
- Python之路(第二十四篇) 面向对象初级:多态、封装
一.多态 多态 多态:一类事物有多种形态,同一种事物的多种形态,动物分为鸡类,猪类.狗类 例子 import abc class H2o(metaclass=abc.ABCMeta): def _ ...
随机推荐
- Android Tween和Frame 动画
关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式: 1. Tween Animation:通过对场景里的对象不断做图像变换(平移.缩放. ...
- jq获取单选框、复选框、下拉菜单的值
1.<input type="radio" name="testradio" value="jquery获取radio的值" /> ...
- pytorch 动态调整学习率 重点
深度炼丹如同炖排骨一般,需要先大火全局加热,紧接着中火炖出营养,最后转小火收汁.本文给出炼丹中的 “火候控制器”-- 学习率的几种调节方法,框架基于 pytorch 1. 自定义根据 epoch 改变 ...
- HTML5有哪些新特性?移除了哪些元素?
HTML5新特性: 拖放(Drag and drop)API 语义化标签(header.nav.footer.section.article.aside) 音频.视频(audio.video)API ...
- mysql多表连接和子查询
文章实例的数据表,来自上一篇博客<mysql简单查询>:http://blog.csdn.net/zuiwuyuan/article/details/39349611 MYSQL的多表连接 ...
- 关于 FormData 和 URLSearchParams
一.FormData FormData 接口提供了一种表示表单数据的键值对的构造方式,经过它的数据可以使用 XMLHttpRequest.send() 方法送出,本接口和此方法都相当简单直接.如果送出 ...
- C# 判断两条直线距离
本文告诉大家获得两条一般式直线距离 一般式的意思就是 Ax+By+C=0" role="presentation">Ax+By+C=0Ax+By+C=0 如果有两个 ...
- Codeforces Round #186 (Div. 2)
A. Ilya and Bank Account 模拟. B. Ilya and Queries 前缀和. C. Ilya and Matrix 考虑每个元素的贡献. 边长为\(2^n\)时,贡献为最 ...
- webpack优化 -- compression-webpack-plugin 开启gzip
webpack优化 -- compression-webpack-plugin 开启gzip 打包的时候开启gzip可以大大减少体积,非常适合于上线部署.下面以vue-cli2.x项目为例,介绍如何在 ...
- Promise的封装
要封装Promise,首先要了解Promise的使用. Promise有以下几个特点:1.Promise是一个构造函数 2.实例化Promise时有两个回调函数,resolve,reject ,成功执 ...