·1、继承
python3中所有的类默认继承object类。
1 class Animal: 2 def __init__(self): 3 self.age = 2: 4 self.__height= 12 ##私有变量 5 6 def eat(self): 7 print('eat') 8 9 def sleep(self): 10 prinit('sleep') 11 12 13 ## 语法:class 子类(父类) 14 ## 子类就会有父类的公有属性和方法 15 class Bird(Animal): ##Bird继承Animal 16 17 def __init__(self): 18 super.__init__() ##调用父类的构造方法,保留父类的属性 19 self.name = 'Polly' 20 21 def fly(self): 22 ## print(self.__height) ##子类没有继承私有属性 23 print('f飞来飞去') 24 25 class Maque(Bird): 26 def ttt(self): 27 print('麻雀') 28 29 class Fish(Animal): 30 def swim(self): 31 print('如鱼得水') 32 33 bird = Bird() 34 bird.eat() ##调用父类的方法 35 bird.sleep() 36 print(bird.age) ##调用父类的属性(成员变量) 37 bird.fly() ## 调用自己的方法 38 39 fish = Fish() 40 fish.eat() ## 调用父类的方法 41 fish.swim() ##调用自己的方法 42 43 ##python中有单继承和多继承!! 44 #同时继承多个!!
多继承
1 ## 多继承 2 3 class Father: 4 def drink(self): 5 print('drink') 6 7 def sleep(self): 8 print('Father sleep') 10 11 class Mother: 12 def shopping(self): 13 print('shopping') 14 15 def sleep(self): 16 print('Mother Sleep') 18 19 class Son(Mother, Father): ## 多继承 ,这个继承是有顺序的 20 def sleep(self): 21 print('Son Sleep') 22 ''' 23 若是自己存在这个方法,就调用自己的方法!! 24 若是自己没有,就会调用先继承的父类的方法 25 ''' 26 28 s = Son() 29 30 ##先重子类找sleep方法,如果没有就找父类,一直往上找,直到完成,或者报错 31 s.sleep() ## 调用Father父类的方法 32 s.shopping() ##调用Mother父类的方法 33 34 print(Son.__mro__)## 获取属性或者方法查找顺序 35 36 37 ##判断这个对象是否是某个类的实例(对象) 38 print(isinstance(s,Son)) 39 print(isinstance(s,Father)) 40 print(isinstance(s,Mother)) 41 print(isinstance(s,object))
2、方法重写
1 class Father: 2 3 def drink(self): 4 print('喜欢喝酒') 5 6 def sleep(self): 7 print('没事就梦游') 8 9 10 class Son(Father): 11 12 def drink(self, item): ## 对父类的方法进行重写 13 print('我不喝酒,喜欢喝%s' % item) 14 15 ## 父类部分满足功能,子类有增加功能 16 ## 用super调用父类的方法 17 ## 一般是在继承和重写的情况下,使用super调用父类的方法 18 def sleep(self): 19 # print('没事就梦游') 20 super().sleep() 21 print('喜欢说梦话') 22 23 def run(self): 24 print('run') 25 super().sleep() ## 不是重写也可以super调用父类的方法 26 28 s = Son() 29 s.drink('橙汁') ##调用重写的方法 30 s.sleep()
3、多态
所谓多态,就是调用不同的方法,产生不同的表现结果
1 ## 1、继承的多态,类似于java 2 class Animal: 3 def beaten(self): ##被打 4 pass 5 6 class Cat(Animal): 7 def beaten(self): 8 print('敢打我,挠死你!!') 9 10 class Dog(Animal): 11 def beaten(self):##重写beaten方法 12 print('敢打我,咬死你!!') 13 14 ## 2、不继承的多态 15 ## 鸭子类型--- 看起来像多态,就是多态!!! 16 ## python中的多态和继承是没有关系的!!! 17 class Frog: ##不继承,没有beaten方法,但是自己定义了beaten方法 18 def swim(self): 19 print('正在游泳') 20 21 def beaten(self): 22 print('青蛙被打,呱呱,继续游泳') 23 24 class Outman: 25 def beatAnimal(self, animal): 26 print('打小动物') 27 animal.beaten() 28 29 30 dijia = Outman() 31 cat = Cat() ##猫 32 dijia.beatAnimal(cat) 33 34 dog = Dog() ##狗 35 dijia.beatAnimal(dog) 36 37 frog = Frog() 38 dijia.beatAnimal(frog) #没有方法
总结:
1、当类之间有显著的不同,并且较大的类是由较小的类组成的时候,用组合(把小的那个类作为大类的变量)
2、当类之间有很多相同的功能,提取这些共同的功能作为基类,用继承比较好
4、接口继承
1 ## 普通 2 class Disk: ##硬盘 3 def read(self): 4 pass 5 6 def write(self): 7 pass 8 9 class Cdrom: #光驱 10 def read(self): 11 pass 12 13 def write(self): 14 pass 15 16 class Mem: 17 def read(self): 18 pass 19 20 def write(self): 21 pass 22 23 24 ## 用继承改造代码: 25 26 class All_file: ##最为父类---基类 27 def read(self): 28 pass 29 30 def write(self): 31 pass 32 33 class Disk(All_file): #硬盘继承all_file 34 pass 35 36 class Cdrom(All_file): #光驱继承all_file 37 pass 38 39 class Mem(All_file):继承all_file 40 pass 41 42 43 ##接口继承-- 子类必须实现 44 import abc 45 class All_file(metaclass = abc.ABCMeta): ##最为接口类,只定义不实现 46 @abc.abstractmethod 47 def read(self): 48 pass 49 50 @abc.abstractmethod 51 def write(self): 52 pass 53 54 class Disk(All_file): #硬盘继承all_file接口,实现具体的功能 55 def read(self): 56 pass 57 58 def write(self): 59 pass 60 61 class Cdrom(All_file): #光驱继承all_file 62 def read(self): 63 pass 64 65 def write(self): 66 pass 67 68 class Mem(All_file):继承all_file 69 def read(self): 70 print('Mem read') 71 72 def write(self): 73 print('Mem write') 74 75 ## 接口就是一个函数,在java中有个关键字叫interface 76 77 78 79 80 81
有生之年,只诉衷肠不言殇.....