python学习-64 面向对象三大特性----继承1
面向对象三大特性
1.三大特性?
继承,多态,封装
2.什么是继承?
类的继承和现实生活中的父与子,继承关系是一样的,父类为基类。
python中的类继承分为:单继承和多继承
3.举例说明
class Dad: money = 100 def __init__(self,name): self.name =name print(name) def hit(self): print('%s 正在打孩子' %self.name) class Son(Dad): pass s1 = Son('abc') print(Son.money) s1.hit()
运行结果:
abc 100 abc 正在打孩子 Process finished with exit code 0
4.什么时候用继承?
----当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好。
----当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好。
class Animals: def eat(self,name): print('%s 正在吃'%self.name) def drink(self,name): print('%s 正在喝'%self.name) class Cat(Animals): def __init__(self,name): self.name = name class Dog(Animals): def __init__(self,name): self.name = name c1 = Cat('xiaobai') c1.eat(Animals) c1.drink(Animals) d1 = Dog('xiaohei') d1.drink(Animals) d1.eat(Animals)
运行结果:
xiaobai 正在吃
xiaobai 正在喝
xiaohei 正在喝
xiaohei 正在吃
Process finished with exit code 0
5.接口继承与归一化设计
父类当中规定好了,子类的方法,但是不去实现。只要子类继承了父类,需要自己再去实现自己的方法。
举例:(一切皆文件)
import abc class Test(metaclass=abc.ABCMeta): # 加上一个限制,只是为了规范子类 @abc.abstractclassmethod # 必须有以下函数,不然无法实例化 def read(self): pass @abc.abstractclassmethod # 必须有以下函数,不然无法实例化 def write(self): pass class Disk(Test): def read(self): print('this disk read') def write(self): print('this is disk write') class CD(Test): def read(self): print('this cd read') def write(self): print('this is cd write') class Mem(Test): def read(self): print('this is mem read') def write(self): print('this is mem write') d1 = Disk() d1.read() d1.write() c1 = CD() c1.read() c1.write() m1 = Mem() m1.read() m1.write()
运行结果:
this disk read this is disk write this cd read this is cd write this is mem read this is mem write Process finished with exit code 0
6.继承顺序
---- python的类可以继承多个类,Java和C#中则只能继承一个类
----python的类如果继承多个类,那么其寻找方法的方式有两种,一是深度优先,二是广度优先
~~~~子类会先于父类被检查
~~~~多个父类会根据它们在列表中的顺序被检查
~~~~如果对下一个类存在两个合法的选择,选择第一个父类