当前位置: 首页 > 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并发编程之:线程共享数据的方式
  • __proto__ 和 prototype的关系
  • 【知识碎片】第三方登录弹窗效果
  • 78. Subsets
  • Hibernate【inverse和cascade属性】知识要点
  • Javascript基础之Array数组API
  • laravel 用artisan创建自己的模板
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Logstash 参考指南(目录)
  • MySQL-事务管理(基础)
  • mysql中InnoDB引擎中页的概念
  • php中curl和soap方式请求服务超时问题
  • REST架构的思考
  • 前端技术周刊 2019-01-14:客户端存储
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • Java数据解析之JSON
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragma once
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2)MFC+openGL单文档框架glFrame
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)Google Chrome调试JS
  • .apk文件,IIS不支持下载解决
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Micro Framework初体验
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET简谈设计模式之(单件模式)
  • .NET连接MongoDB数据库实例教程
  • .net流程开发平台的一些难点(1)
  • .NET序列化 serializable,反序列化
  • ?php echo ?,?php echo Hello world!;?
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @SpringBootApplication 包含的三个注解及其含义
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [\u4e00-\u9fa5] //匹配中文字符
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [codeforces]Levko and Permutation