直接看代码:

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之面向对象中的多态的更多相关文章

  1. JAVA 面向对象中的多态

    多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...

  2. Python入门-面向对象三大特性-多态

    Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型".

  3. 设计模式-Template(行为模式) 采用 继承的方式 将算法封装在抽象基类中,在子类中实现细节。利用面向对象中的多态实现算法实现细节和高层接口的松耦合。

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Template.h class AbstractClass { public: virtual ~AbstractCla ...

  4. python面向对象(封装、多态、反射)

    目录 面向对象之封装 @property 面向对象之多态 面向对象之反射 面向对象之封装 含义 将类中的某些名字按照特殊的书写方式"隐藏"起来,不让外界直接调用,目的是为了不然外界 ...

  5. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  6. java中实现多态的机制是什么?

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  7. c++中的多态机制

    目录 1  背景介绍 2  多态介绍 2-1  什么是多态 2-2  多态的分类 2-3  动态多态成立的条件 2-4  静态联编和动态联编 2-5  动态多态的实现原理    2-6   虚析构函数 ...

  8. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  9. Python之路(第二十四篇) 面向对象初级:多态、封装

    一.多态 多态 多态:一类事物有多种形态,同一种事物的多种形态,动物分为鸡类,猪类.狗类 例子 import abc class H2o(metaclass=abc.ABCMeta): ​ def _ ...

随机推荐

  1. 【datagrid】动态加载列 2016-01-03 16:32 2013人阅读 评论(19) 收藏

    之前我们的项目在前台显示只需要把数据从数据库读出来进行显示就可以,datagrid的表头字段都是写死的,把数据往表里一扔,就基本没什么事儿了,结果客户前几天要求,其中一个字段不能是死的,应该是有多少项 ...

  2. JavaScript 开发者都应该知道的十个概念

    1. 原始值和引用值(Value vs. Reference) 理解对象.数组和函数是如何复制和传递到函数中的.了解引用值是被复制了什么,理解原始值是通过复制值来进行复制和传递的. 简析:ECMASc ...

  3. @atcoder - AGC034D@ Manhattan Max Matching

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 考虑一个二维平面,执行共 2*N 次操作: 前 N 次,第 i ...

  4. Laravel 的HTTP控制器

    简介# 除了在路有文件中以闭包的形式定义所有的请求处理逻辑外,还可以使用控制器类来组织此类行为,控制器能够将相关 的请求处理逻辑组成的一个单独的类,控制器被存放在app/Http/Controller ...

  5. oracle函数 INSTR(C1,C2[,I[,J]])

    [功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数] C1    被搜索的字符串 C2    希望搜索的字符串 I     搜 ...

  6. 【codeforces 777E】Hanoi Factory

    [题目链接]:http://codeforces.com/problemset/problem/777/E [题意] 让你摆汉诺塔片; 要求在上面的片的外圈大于在下面的片的内圈,且小于下面的片的外圈; ...

  7. 【DCN】端口与地址绑定技术

    端口与地址绑定技术   与AM技术不同之处在于,AM端口下绑定的MAC或IP能够通信,不限制绑定的MAC在其它接口下通信.   开启MAC-CPU学习模式 mac-address-learning c ...

  8. window10+python3.7安装tensorflow--gpu tensorflow 安装

    能安装GPU的前提是:1.显卡支持CUDA (1)右击我的电脑–属性 (2)打开设备管理器   (3)显示适配器 我的电脑是支持CUDA的 2.pip 版本 >= 8.1查看pip版本 :pip ...

  9. Flex AIR应用GPS定位功能(Android和IOS)

    说明: 使用AIR进行GPS定位功能实现时,会经常判断GPS是否打开.一般的官方或者书上的介绍的方法,测试后,只能对Android系统进行判断,而对ios系统则无法进行判断. 经过研究测试,终于解决实 ...

  10. Delphi的不足

    Delphi拥有C#那样的开发速度,同时运行速度也很快,而且不需要.net运行时(可以免安装直接运行).为什么还是衰落了呢? 既不是单根体系,又缺少泛型支持.导致delphi没法做map.list.v ...