面向对象二

一.继承的另一种使用方式

最常见的是直接继承一个已经存在的类

当你想要创建一个新的类 发现这个类中的一些 在某一个类中已经存在

那就没有必要从头开始写 ,可以直接继承已有的类 然后做补充

 1 class MyList(list):
 2     def __init__(self,element_cls):
 3         # 当你覆盖了init方法时
 4         # 不要忘记调用super().init函数让父类完成原有的初始化操作
 5         super().__init__()
 6         self.element_cls = element_cls
 7 
 8         
 9     def append(self, object):
10         # if isinstance(object,str)
11         if object.__class__ == self.element_cls:
12             super().append(object)
13         else:
14             print("只能存储%s类型!" % self.element_cls.__name__)

2.super()的问题 mro列表

python支持多继承 一个类可以同时继承多个父类

好处是更加灵活

多继承时如果多个父类中出现了同名的属性/函数
你不能用看来判断查找顺序 ,需要使用mro列表来查看真正的继承顺序,super在访问父类属性时 是按照mro列表一层层往上找的

 1 class A:
 2     def test(self):
 3         print("from A")
 4         super().test() # 应该报错..... 但是却执行成功了
 5 class B:
 6     def test(self):
 7         print("from B")
 8     pass
 9 
10 class C(A,B):
11     pass
12 
13 c = C()
14 c.test()

  注意事项: 尽量不要使用多继承

二. 组合
指的是 一个类把另一个类的对象作为自己的属性 就称之为组合
无处不在
当你定义一个类 并且这个类拥有某种类型的属性时 就称之为组合
都是用用来重用代码的方式:
组合描述的是 什么拥有什么的关系   什么有什么,什么有什么
基础描述的是 什么是什么的关系      什么是什么,什么是什么

 1 class PC:
 2     def open_app(self,app_name):
 3         print("open %s" % app_name)
 4 
 5 class OldBoyStudent:
 6     def __init__(self,PC,notebook):
 7         self.PC = PC
 8         self.notebook = notebook
 9     pass
10 
11 pc = PC()
12 notebook = PC()
13 
14 
15 stu = OldBoyStudent(pc,notebook)

三.新式类与经典类

 1 class A:
 2     # a = 1
 3     pass
 4 
 5 class B(A):
 6     # a = 2
 7     pass
 8 
 9 class C(A):
10     # a = 3
11     pass
12 
13 class D(A):
14     # a = 4
15     pass
16 
17 class E(B,C,D):
18     # a = 5
19     pass
20 
21 e1 = E()

新式类:直接或间接继承object,就是新式类,py3中都是的
经典类:没有直接或间接继承object,就是经典类,一般出现在py2中

四.接口

接口:就是一套协议规范

在程序中功能通常是用函数来表示, 对于外界而言 无需清楚函数时如何实现的 只要知道函数名即可, 这个函数名称就可以称之为接口

接口中不应该包括非抽象方法的函数

接口的示例如下:

 1 class USB:
 2 
 3     def open(self):
 4         pass
 5 
 6     def close(self):
 7         pass
 8 
 9     def work(self):
10         pass

接口的好处是:

使用接口可以提高程序的扩展性

只要对象按照接口规定方法来实现,使用者就可以无差别使用所有对象

五.抽象类

抽象:指的就是,不清楚,不明白,看不懂

抽象方法:指的是 没有函数体的方法 用@abc.abstractmethod 装饰器如果类中具备抽象方法 那么这个类就称之为抽象类

抽象与接口的区别:不能直接实例化 必须有子类覆盖了所有抽象方法后才能实例化子类

举例:

 1 import abc
 2 
 3 class Test(metaclass=abc.ABCMeta):
 4 
 5     @abc.abstractmethod
 6     def say_hi(self):
 7         pass
 8 
 9 class TT(Test):
10 
11     def say_hi(self):
12         print("i am TT obj")
13 
14 t = TT()
15 t.say_hi()

六.鸭子类型

鸭子类型:说如果一个对象叫声像鸭子,走路像鸭子,长得像鸭子,那它就是鸭子

python不喜欢限制一个人,鸭子类型就是python推荐的方法:

举例如下:

 1 class PC():
 2 
 3     def conntent_device(self, usb_device):
 4         usb_device.open()
 5         usb_device.work()
 6         usb_device.close()
 7 
 8 class Mouse:
 9     # 实现接口规定的所有功能
10     def open(self):
11         print("mouse opened")
12 
13     def work(self):
14         print("mouse working...")
15 
16     def close(self):
17         print("mouse closed")
18 
19 mouse = Mouse()
20 pc = PC()
21 
22 pc.conntent_device(mouse)
23 
24 
25 
26 class KeyBoard:
27     def open(self):
28         print("KeyBoard opened")
29 
30     def work(self):
31         print("KeyBoard working...")
32 
33     def close(self):
34         print("KeyBoard closed")
35 
36 key1 = KeyBoard()
37 
38 # 如果key1的特征和行为都像USB设备 那就把它当做USB设备来使用
39 # 对于使用者而言可以不用关心这个对象是什么类,是如如何是实现,
40 pc.conntent_device(key1)

示例二:

 1 class Linux:
 2     def read_data(self,device):
 3         data = device.read()
 4         return data
 5 
 6     def write_data(self,device,data):
 7         device.write(data)
 8 
 9 class Disk:
10     def read(self):
11         print("disk reading....")
12         return "这是一个磁盘上的数据"
13 
14     def write(self,data):
15         print("disk writing %s..." % data)
16 
17 class UP:
18     def read(self):
19         print("disk reading....")
20         return "这是一个U盘上的数据"
21 
22     def write(self,data):
23         print("disk writing %s..." % data)
24 
25 
26 l = Linux()
27 
28 d = Disk()
29 data = l.read_data(d)
30 l.write_data(d,"这是一个数据....")
31 
32 
33 up1 = UP()
34 l.read_data(up1)
35 l.write_data(up1,"一个数据...")

 

posted @ 2019-05-17 20:20  坚信会有奥特曼~  阅读(144)  评论(0)    收藏  举报