面向对象 -- 多态
2019-01-11 本文已影响0人
__深蓝__
多态,体现类的可变性,提高了类应对变化的能力
![](https://img.haomeiwen.com/i15420318/62d2b05de6658cd5.png)
实例演示:办公自动化
需求:
- 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)
,一个动物只要看起来像鸭子,走起路来像鸭子
,那它就可以被看做是鸭子
练习:
![](https://img.haomeiwen.com/i15420318/cbf70ef6ca1ac590.png)
- end -