面向对象三大特性之继承
面向对象的三大特性之继承
大体思路
继承
继承和抽象 两个概念
单继承
语法 : 父类 子类
继承与重用
子类可以使用父类中的名字(变量和方法)
继承与派生
子类在父类的基础上又新创建了自己需要的方法和属性
父类有的子类没有 - 子类对象直接调用 就会直接执行父类的方法
父类有的子类也有 - 子类对象调用 直接执行子类中的方法
想在子类中使用父类的名字 : 父类名、super()去调用
规范的编程模式
抽象类
多继承
语法
接口
新式类和经典类
新式类中
所有的多继承关系寻找方法的顺序 - 遵循广度优先算法
继承object
mro方法
super : super不是单纯的找父类,而是遵循mro顺序的
经典类
python2.x
不主动继承object
经典类在找父类中方法的过程中 遵循 —— 深度优先
不提供mro方法和super
先抽象 后继承
猫类 : 属性 : 名字,品种,食物 方法 : 叫,抓老鼠,吃,喝 狗类 : 属性 : 名字,品种,食物 方法 : 叫,看家,吃,喝 class Animal: def __init__(self,name,kind,food,laguage): self.name=name self.king=kind self.food=food self.language=laguage def yell(self): print('%s叫'%(self.language)) def eat(self): print('吃%s'%(self.food)) def drink(self): print('喝水') class Cat(Animal): def catch_mouse(self): print('抓老鼠') class Dog(Animal): def look_after_house(self): print('看家') cat1=Cat('阿猫','橘猫','牛杂','喵喵') print(cat1.name) #阿猫 cat1.drink() #喝水 cat1.eat() #吃牛杂 cat1.yell() #喵喵叫
继承
父类/超类/基类:Animal
子类/派生类:Cat Dog
继承与重用---父类中所有的属性和方法都可以被子类使用了
1 class Animal: 2 def __init__(self,name,kind,food,laguage): 3 self.name=name 4 self.king=kind 5 self.food=food 6 self.language=laguage 7 def yell(self): 8 print('%s叫'%(self.language)) 9 def eat(self): 10 print('吃%s'%(self.food)) 11 def drink(self): 12 print('喝水') 13 class Cat(Animal): 14 def __init__(self,name,kind,food,laguage,eye_color): 15 self.eye_color=eye_color 16 Animal.__init__(self,name,kind,food,laguage) 17 super().__init__(name,kind,food,laguage) 18 def catch_mouse(self): 19 print('抓老鼠') 20 def eat(self): 21 Animal.eat(self) # 在子类中调用父类的方法 22 super().eat() #功能是一样的 23 self.weight=10 24 class Dog(Animal): 25 def look_after_house(self): 26 print('看家') 27 阿猫 = Cat('阿猫','橘猫','牛杂','喵喵','绿色') 28 print(阿猫.eye_color) 29 print(阿猫.food) 30 阿猫.catch_mouse() 31 阿猫.eat() 32 print(阿猫.weight)
当子类中有要被调用的方法的时候子类的对象会直接选择子类中的方法、变量,父类中的方法不会被自动执行。
如果我们既想执行子类的方法,又想执行父类的方法,那么需要在子类的方法中调用父类的方法。
父类名.方法(self......)
super().方法名(.......) 帮助我们在子类中调用父类的方法
面试题:
class Foo:
def __init__(self):
self.func()
def func(self):
print('in Foo')
class Son(Foo):
def func(self):
print('in Son')
s1=Son()
抽象类:
抽象类是一个规范,它基本不会实现什么具体的功能,抽象类不能被实例化。
要想写一个抽象类:
from abc import ABCMeta,abstractclassmethod
在这个类创建饿时候指定meteclass =ABCMeta
在你希望子类实现的方法上加上一个@abstractmethod装饰器
使用抽象类:
继承这个类
必须实现这个类中被@abstractmethod装饰器装饰的方法
多继承
多继承:python、c++
java、c#没有
多继承
1 天鹅 飞 游泳 走路 2 老虎 走路 游泳 3 鹦鹉 飞 说话 走路 4 class Animal: 5 def __init__(self,name): 6 self.name=name 7 class FlyAnimal(Animal): 8 def fly(self): 9 print('%s在飞'%self.name) 10 class WalkAnimal(Animal): 11 def walk(self): 12 print('%s再走路'%self.name) 13 class SwimAnimal(Animal): 14 def swim(self): 15 print('%s在游泳'%self.name) 16 class Tiger(SwimAnimal,WalkAnimal): 17 pass 18 class Swan(SwimAnimal,WalkAnimal,FlyAnimal): 19 pass 20 class Parrot(FlyAnimal,WalkAnimal): 21 def talk(self): 22 print('%s说话了'%self.name) 23 swan=Swan('天鹅') 24 swan.fly() 25 swan.walk()
新式类
在python3.X中,所有的类都是新式类
所有的新式类都有一个默认的父亲:object
python2.7
经典类与新式类共存
没有继承object的类是经典类
多继承的顺序:在新式类和经典类之间的区别
新式类中:
所有的多继承关系寻找方法的顺序——遵循广度优先算法
继承object
mro方法
super:super不是单纯的找父类,而是遵循mro顺序的

经典类:
python2.x
不主动继承object
经典类在找父类中方法的过程中遵循——深度优先
不提供mro和super
一条路走到头,再换下一条
清风深知杨柳意,啤酒龙虾难相聚。


浙公网安备 33010602011771号