关闭

Python多态

标签: 多态python继承
110人阅读 评论(0) 收藏 举报
分类:

多态
类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 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 的实际类型上。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 json

class Students(object):
    def read(self):
        return r'["Tim", "Bob", "Alice"]'

s = Students()

print json.load(s)
0
0
查看评论

Python:实现多态

定义一个在校人的基类,分别派生出教师和学生,然后放入列表中,实现多态。 #!/usr/bin/python #Filename:inherit.py class SchoolMember: '''Represents any school member.'...
  • nyist327
  • nyist327
  • 2015-06-16 19:05
  • 1403

Python学习篇 之 如何实现多态机制

Python中没有重载的概念,所以其类的构造函数只能有一个。 那么当遇到需要重载的情况时,Python是如何实现此类功能的呢?     A : 首先需要了解一下为什么需要提供函数重载:      函数重载主要为了解决两个问题    ...
  • ZZh1301051836
  • ZZh1301051836
  • 2017-09-03 12:01
  • 308

【Python学习笔记】面向对象编程:继承和多态

【根据廖雪峰python教程整理】 一、继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。  ...
  • Junkichan
  • Junkichan
  • 2016-07-11 15:14
  • 808

java中多态以及python动态语言

java中的多态 1、什么是多态 java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的编译类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现多态。(通过一个父类能够引用不同的子类) 2、如何实现多态 java...
  • u014689510
  • u014689510
  • 2015-12-19 14:07
  • 482

Python 没有多态

C++的多态表示: 基类指针指向派生类对象。 Python变量无类型,自然也就不存在多态。 python是一种动态语言,参数在传入之前是无法确定参数类型的 class A: def prt(self): print "A" cla...
  • rommi
  • rommi
  • 2016-04-26 19:43
  • 397

python中多态与java中多态

python中多态  A function that can operate on more than one type. If all the operations in a function can be applied to a type, then the functi...
  • bravekingzhang
  • bravekingzhang
  • 2014-02-17 14:32
  • 1352

python中的多态和鸭子模型

多态性 是允许将父对象设置成为和一个或多个它的子对象相等的技术,比如Parent:=Child; 多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作. c++中多态更容易理解的概念为 允许父类指针或名称来引用子类对象,...
  • fly910905
  • fly910905
  • 2017-07-20 08:15
  • 505

python 对象的魔力--多态、封装和继承

简单介绍下这几个名词的意思。 多态(Polymorphism):意味着可以对不同类的对象使用相同的操作。 封装(Encapsulation): 即对外部世界隐藏对象的工作细节。 继承(Inheritance): 以通用的类为基础建立专门的类对象。  一、多态  ...
  • u011510825
  • u011510825
  • 2016-02-23 21:57
  • 804

python多态和封装

多态和封装 >>> "This is a book".count("s") 2 >>> [1,2,4,5,3].count(3) 1 >>> f = lambda x,y:...
  • baiyibin0530
  • baiyibin0530
  • 2016-06-06 09:46
  • 268

【python学习笔记】Python面向对象的理解(封装,继承,多态)

说明提到面向对象,总是离不开几个重要的术语:多态(Polymorphism),继承(Inheritance)和封装(Encapsulation)。Python也是一种支持OOP的动态语言,本文将简单阐述Python对面向对象的支持。在讨论Python的OOP之前,先看几个OOP术语的定义: 类:对具...
  • qq_29287973
  • qq_29287973
  • 2017-09-06 16:46
  • 1633
    个人资料
    • 访问:9559次
    • 积分:359
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:5篇
    • 译文:14篇
    • 评论:3条