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

python之多态

多态
类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法:class Person(object):def __init__(self, name, gender):self.name = nameself.gender = genderdef whoAmI(self):return 'I am a Person, my name is %s' % self.nameclass Student(Person):def __init__(self, name, gender, score):super(Student, self).__init__(name, gender)self.score = scoredef whoAmI(self):return 'I am a Student, my name is %s' % self.nameclass Teacher(Person):def __init__(self, name, gender, course):super(Teacher, self).__init__(name, gender)self.course = coursedef 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 的实际类型上。s 是Student类型,它实际上拥有自己的 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)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。任务
Python提供了open()函数来打开一个磁盘文件,并返回 File 对象。File对象有一个read()方法可以读取文件内容:例如,从文件读取内容并解析为JSON结果:import json
f = open('/path/to/file.json', 'r')
print json.load(f)
由于Python的动态特性,json.load()并不一定要从一个File对象读取内容。任何对象,只要有read()方法,就称为File-like Object,都可以传给json.load()。请尝试编写一个File-like Object,把一个字符串 r'["Tim", "Bob", "Alice"]'包装成 File-like Object 并由 json.load() 解析。?不会了怎么办
只要为Students类加上 read()方法,就变成了一个File-like Object。参考代码:import jsonclass Students(object):def read(self):return r'["Tim", "Bob", "Alice"]'s = Students()print json.load(s)
http://www.hskmm.com/?act=detail&tid=29461

相关文章:

  • Linux安装JDK1.8 tomcat MariaDB(MySQL删减版)
  • Ubuntu系统部署Anaconda环境及Python语言的详细流程
  • python之继承
  • RK3568+MCU实时机器人解决方案 - 教程
  • 做题记录 #2
  • 深度学习开源书籍的技术解析
  • Nginx怎么去做负载均衡?
  • 向量库面试题
  • 02 常用快捷键和指令
  • 深圳公共资源交易中心 www.szzfcg.cn
  • mysql百分数转小数点格式
  • mysql误删的performance_schema库
  • 操作系统内存管理思维导图总结
  • 15
  • 取证复刻1
  • 如何在Ubuntu中查看编辑lvgl的demo和examples?
  • 英语_翻译
  • 操作系统(Linux)文件系统思维导图总结
  • mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
  • linux查看/修改各种资源限制ulimit
  • MySQL非root安装-初始化数据库时unknown variable ‘defaults-file=**/my.cnf‘
  • python中mod函数怎么用
  • Educational Codeforces Round 101 (Rated for Div. 2) 题解
  • Centos7下docker的jenkins下载并配置jdk与maven
  • The 2024 ICPC Asia Shanghai Regional Contest
  • 英语_阅读_Fireflies_待读
  • 1.基础
  • 深入解析:RoadCLIP 笔记 针对自动驾驶优化的 CLIP 变体 vlm
  • ASP.NET Razor VB 变量 - 实践
  • dos命令和命令提示符