·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