美文网首页
面向对象 -- 多态

面向对象 -- 多态

作者: __深蓝__ | 来源:发表于2019-01-11 10:54 被阅读0次

多态,体现类的可变性,提高了类应对变化的能力

实例演示:办公自动化

需求:

  • word软件用来编辑文字、打印文件内容
  • 打印机用来将文字打印到A4纸上,激光打印机是黑白的,喷墨打印机是彩色的
  • 设计类


  • 实现word类

class Word:
    def __init__(self, filename):
        self.filename = filename
        self.text = None

    def edit_text(self, text):
        self.text = text

    def print_text(self, printer):
        printer.output(self.text)
  • 实现Printer类
class Printer:
    def __init__(self, model):
        self.model = model

    def output(self, text):
        print("%s打印机输出了:%s" % (self.model, text))
  • 实现WBPrinter类
class WBPrinter(Printer):
    def __init__(self, model):
        super().__init__(model)

    def output(self, text):
        print("%s打印机输出了黑白的:%s" % (self.model, text))
  • 实现CPrinter类
class CPrinter(Printer):
    def __init__(self, model):
        super().__init__(model)

    def output(self, text):
        print("%s打印机输出了彩色的:%s" % (self.model, text))
  • 测试
f1 = Word('f1')
p1 = Printer('HP')

f1.edit_text('abcdefg')
f1.print_text(p1)

p2 = WBPrinter('Lenove')
f1.print_text(p2)

p3 = CPrinter('Epson')
f1.print_text(p3)

不同对象接收到同一消息时,表现出不同的行为,这种现象称为多态

判断对象类型

判断一个变量的类型可以用isinstance()判断

print(isinstance(p1, Printer))
print(isinstance(p2, Printer))
print(isinstance(p3, Printer))

print(isinstance(p2, WBPrinter))
print(isinstance(p1, WBPrinter))

print(isinstance(p3, CPrinter))
print(isinstance(p1, CPrinter))

True
True
True
True
False
True
False

通过上边的例子可以看到,子类也是父类的类型,但反过来不是

鸭子类型
class Duck:
    def output(self, text):
        print("打印纸被鸭子叼走了-_-|||")`

d = Duck()
f1.print_text(d)

打印纸被鸭子叼走了-_-|||
  • Python中,不要求严格的继承体系,任何类只要实现了output方法,就可以被Word类的对象调用
  • 这种现象被称为鸭子类型(file-like object),一个动物只要看起来像鸭子,走起路来像鸭子,那它就可以被看做是鸭子
练习:




- end -

相关文章

  • Java基础day08笔记:多态|多态中成员的特点|多态的应用示

    01-面向对象(多态-概念) 接下来说一下面向对象的第三个特征:多态。 何为多态呢? 其实...

  • 宅男知识大补丸 学多态 认包包

    java零基础入门-面向对象篇(十) 多态 面向对象的三大特征,封装,继承我们讲完了,这次来讲多态。 多态就是指一...

  • OC面向对象—多态

    OC面向对象—多态 OC面向对象—多态 一、基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没...

  • Java学习day-07:面向对象

    一、面向过程和面向对象 1.面向对象与面向过程的区别: 面向对象具有三大特征;封装,继承,多态;面向对象与面向过程...

  • Kotlin入门学习(二)

    新的篇章 面向对象 面向对象-封装 面向对象-继承 面向对象-抽象类和多态 接口 委托和代理 by关键字 委托...

  • 对象和面向对象的介绍

    对象分为 面向对象和基于对象: 面向对象:面向对象定义: 可以创建自定义类型、很好的支持继承和多态。面向对象的语言...

  • C#之面向对象基础篇

    面向对象编程:简称OOP 面试题:什么是面向对象? 答:封装,继承,多态即为面向对象 面相对象的方法: 面向对象的...

  • 面向对象

    面向对象有3大特性:封装、继承、多态1、介绍面向对象编程 面向对象编程(Object Oriented Progr...

  • python 高级 面向对象编程(OOP)

    面向对象有3大特性:封装、继承、多态 1、介绍面向对象编程 面向对象编程(Object Oriented Pro...

  • 再议封装、继承、多态

    封装 面向过程和面向对象区别 继承 多态 运行结果:

网友评论

      本文标题:面向对象 -- 多态

      本文链接:https://www.haomeiwen.com/subject/jbojrqtx.html