当前位置: 首页 > news >正文

**python多态

多态

类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 StudentTeacher ,并都写了一个 whoAmI() 方法:

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def whoAmI(self):
        return 'I am a Person, my name is %s' % self.name

class Student(Person):
    def __init__(self, name, gender, score):
        super(Student, self).__init__(name, gender)
        self.score = score
    def whoAmI(self):
        return 'I am a Student, my name is %s' % self.name

class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course
    def whoAmI(self):
        return 'I am a Teacher, my name is %s' % self.name

在一个函数中,如果我们接收一个变量 x,则无论该 x Person、Student还是 Teacher,都可以正确打印出结果:

def who_am_i(x):
    print x.whoAmI()

p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')

who_am_i(p)
who_am_i(s)
who_am_i(t)

运行结果:

I am a Person, my name is Tim
I am a Student, my name is Bob
I am a Teacher, my name is Alice

这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。sStudent类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。

由于Python是动态语言,所以,传递给函数 who_am_i(x)的参数 x 不一定是 Person 或 Person 的子类型。任何数据类型的实例都可以,只要它有一个whoAmI()的方法即可:

class Book(object):
    def whoAmI(self):
        return 'I am a book'

这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。


来源: http://www.imooc.com/code/6247

 

转载于:https://www.cnblogs.com/wumingxiaoyao/p/7028432.html

相关文章:

  • URAL 1614. National Project “Trams” (图论大YY)
  • glibc中malloc的详细解释_转
  • [笔记] php常见简单功能及函数
  • SQLServer 理解copyonly备份操作
  • pycharm2016序列号失效问题解决办法
  • ASP.NET Core DI 手动获取注入对象
  • 深入浅出 spring-data-elasticsearch - 基本案例详解(三)
  • 远程桌面无法复制粘贴的解决方法
  • 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.1 CPU基础设施基准...
  • “智能云”战略新品震撼发布,开发者如何快速上手?
  • 对于startActivity的使用改进
  • [设计模式][c++]状态切换模式
  • POJ2117-Electricity
  • HTML/CSS 知识点
  • java并发编程之:线程共享数据的方式
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android 架构优化~MVP 架构改造
  • Consul Config 使用Git做版本控制的实现
  • docker容器内的网络抓包
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HTTP中GET与POST的区别 99%的错误认识
  • js作用域和this的理解
  • Linux链接文件
  • Python利用正则抓取网页内容保存到本地
  • 对超线程几个不同角度的解释
  • 诡异!React stopPropagation失灵
  • 聚类分析——Kmeans
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何进阶一名有竞争力的程序员?
  • 时间复杂度与空间复杂度分析
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 小程序 setData 学问多
  • 源码安装memcached和php memcache扩展
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)docker:Dockerfile构建容器运行jar包
  • (十一)图像的罗伯特梯度锐化
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)C#调用WebService 基础
  • .form文件_一篇文章学会文件上传
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Micro Framework初体验(二)
  • .net 简单实现MD5
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .Net8 Blazor 尝鲜
  • .NET微信公众号开发-2.0创建自定义菜单
  • ::before和::after 常见的用法
  • :=
  • @RequestMapping用法详解
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • []sim300 GPRS数据收发程序
  • [1204 寻找子串位置] 解题报告