面向对象 -- 多态

2019-01-11  本文已影响0人  __深蓝__

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

实例演示:办公自动化

需求:

  • word软件用来编辑文字、打印文件内容
  • 打印机用来将文字打印到A4纸上,激光打印机是黑白的,喷墨打印机是彩色的
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)
class Printer:
    def __init__(self, model):
        self.model = model

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

    def output(self, text):
        print("%s打印机输出了黑白的:%s" % (self.model, text))
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 -

上一篇 下一篇

猜你喜欢

热点阅读