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 _ ...
随机推荐
- oralcle函数 AVG([distinct|all]x)
[功能]统计数据表选中行x列的平均值. [参数]all表示对所有的值求平均值,distinct只对不同的值求平均值,默认为all 如果有参数distinct或all,需有空格与x(列)隔开. [参数] ...
- 【批量添加】-SqlBulkCopy语句 标签: sql批量添加 2015-12-20 14:39 1367人阅读 评论(33)
上篇博客我们介绍了通过拼接sql字符串的方法来对sql数据库进行批量添加,但是通过语句拼接insert语句有个缺点,就是每次最多只能添加1000条.当时我们另外一个界面也用到了批量添加,但是这个界面轻 ...
- @atcoder - AGC036D@ Negative Cycle
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N 个点的有向带权图,从 0 编号到 N - 1.一开 ...
- @NOIP2018 - D2T1@ 旅行
目录 @题目描述@ @题解@ @代码@ @题目描述@ 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 n 个城市之间有 m 条双向道路.每条双向道路 ...
- Mysql——ERROR 1045 (28000): Access denied for user 'root'@'localhost'
1.修改my.ini,最后一行添加 skip-grant-tables ,保存关闭.(win10默认安装路径:C:\ProgramData\MySQL\MySQL Server 5.7) 2.重启 ...
- Hadoop应用程序示例2
- es6 promise简析
1.Promise的含义 所谓Promise,就是一个对象,用来传递异步操作的消息. Promise对象有以下两个特点: 对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pen ...
- Android 高仿微信(QQ)滑动弹出编辑、删除菜单效果,增加下拉刷新功能
不可否认,微信.QQ列表的滑动删除.编辑功能着实很经典(从IOS那边模仿过来的),然.Android这边,对列表的操作,其实大多还停留上下文菜单来实现. Android如何实现list item的滑动 ...
- 解决 VS 跳转定义和 Resharper 重复
在大约一周之前,Visual Studio 进行了一项更新,增加了 Ctrl+Click 点击跳转到定义的功能.这项功能与 ReSharper 重复了. 于是可以通过关闭其中一个跳转定义可以使用. V ...
- ∆ (triangle)
2.1 题目描述 给定一个无自环重边的无向图,求这个图的三元环1的个数以及补图2的三元环个数. 2.2 输入格式 第一行 2 个数 n, m ,分别表示图的点数.边数. 接下来 m 行,每行两个数 u ...