·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