您好,欢迎访问三七文档
python中多态类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从Person派生出Student和Teacher,并都写了一个whoAmI()方法:classPerson(object):def__init__(self,name,gender):self.name=nameself.gender=genderdefwhoAmI(self):return'IamaPerson,mynameis%s'%self.nameclassStudent(Person):def__init__(self,name,gender,score):super(Student,self).__init__(name,gender)self.score=scoredefwhoAmI(self):return'IamaStudent,mynameis%s'%self.nameclassTeacher(Person):def__init__(self,name,gender,course):super(Teacher,self).__init__(name,gender)self.course=coursedefwhoAmI(self):return'IamaTeacher,mynameis%s'%self.name在一个函数中,如果我们接收一个变量x,则无论该x是Person、Student还是Teacher,都可以正确打印出结果:defwho_am_i(x):printx.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)运行结果:IamaPerson,mynameisTimIamaStudent,mynameisBobIamaTeacher,mynameisAlice这种行为称为多态。也就是说,方法调用将作用在x的实际类型上。s是Student类型,它实际上拥有自己的whoAmI()方法以及从Person继承的whoAmI方法,但调用s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。由于Python是动态语言,所以,传递给函数who_am_i(x)的参数x不一定是Person或Person的子类型。任何数据类型的实例都可以,只要它有一个whoAmI()的方法即可:classBook(object):defwhoAmI(self):return'Iamabook'这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。任务Python提供了open()函数来打开一个磁盘文件,并返回File对象。File对象有一个read()方法可以读取文件内容:例如,从文件读取内容并解析为JSON结果:importjsonf=open('/path/to/file.json','r')printjson.load(f)由于Python的动态特性,json.load()并不一定要从一个File对象读取内容。任何对象,只要有read()方法,就称为File-likeObject,都可以传给json.load()。请尝试编写一个File-likeObject,把一个字符串r'[Tim,Bob,Alice]'包装成File-likeObject并由json.load()解析。?不会了怎么办只要为Students类加上read()方法,就变成了一个File-likeObject。参考代码:importjsonclassStudents(object):defread(self):returnr'[Tim,Bob,Alice]'s=Students()printjson.load(s)
本文标题:python中多态
链接地址:https://www.777doc.com/doc-4991967 .html