抽象类和接口类做的事情:建立规范
开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
归一化设计:
不管哪一个类的对象,都调用一个函数去完成相同的功能
len()和__len__ (),只有一个类中实现了__len__()方法,才能使用len()函数
from abc import ABCMeta,abstractmethod
#建立一个的的metaclass是ABCMeta,那么这个类就变成一个抽象类(接口类),这个类的主要功能就是建立一个规范
#抽象类中所有被abstractmethod装饰的方法都必须被继承的子类实现,如果不实现,那么实例化的时候就会报错。
#无论是抽象类还是接口类metaclass = ABCMtea都不可以被实例化
依赖倒置原则:
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象;换言之,要针对接口编程,而不是针对实现编程。
接口隔离原则:
使用多个专用接口,而不是用单一的总接口
接口的作用:
在Java中,能够完成接口隔离原则,且完成多继承约束 在python中,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念了
抽象类和接口类:(python中没有接口的概念)
1. 在python中: 1. 在python中被没有什么不同,都是用来约束子类中的方法的
2. 只要是抽像类和接口类中被abstractmethod装饰的方法,都需要子类实现 3. 需要注意的是,当多个类之间有相同的功能也有不同呢的功能的时候,应采用接口类来进行分别约束
2. 在Java中: 1. 抽象类和接口截然不同 2. 抽象类的本质还是一个类,是类就必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么她只能被一个父类控制 3. 当多个类之间有相同的功能也有不同的功能的时候,java就只能用接口来解决
多态:在一个类下发展出来的多个类的对象都可以作为参数传入这里
python天生自带多态效果
1 <1>通过继承实现多态(子类可以作为父类来使用) 2 <2>子类通过重载父类的方法实现多态 3 4 class Animal: 5 def move(self): 6 print('animal is moving....') 7 class Dog(Animal): 8 pass 9 def move(obj): 10 obj.move() 11 12 >>>move(Animal()) 13 >>>animal is moving.... 14 >>>move(Dog()) 15 >>>animal is moving.... 16 17 class Fish(Animal): 18 def move(self): 19 print('fish is moving....') 20 >>>move(Fish()) 21 >>>fish is moving....
鸭子类型
1 <1>变量绑定的类型是不确定的 2 <2>函数和方法可以接收任何类型的参数 3 <3>调用方法时不检查提供的参数类型 4 <4>调用是否成功有参数的方法和属性确定,调用不成功则抛出错误 5 <5>不用实现接口 6 7 class P: 8 def __init__(self, x, y): 9 self.x = x 10 self.y = y 11 def __add__(self, oth): 12 return P(self.x+oth.x, self.y+oth.y) 13 def info(self): 14 print(self.x, self.y) 15 class D(P): 16 def __init__(self, x, y, z): 17 super.__init__(x, y) 18 self.z = z 19 20 def __add__(self, oth): 21 return D(self.x+oth.x, self.y+oth.y, self.z+oth.z) 22 def info(self): 23 print(self.x, self.y, self.z) 24 25 class F: 26 def __init__(self, x, y, z): 27 self.x = x 28 self.y = y 29 self.z = z 30 31 def __add__(self, oth): 32 return D(self.x+oth.x, self.y+oth.y, self.z+oth.z) 33 34 def info(self): 35 print(self.x, self.y, self.z) 36 37 38 def add(a, b): 39 return a + b 40 41 if __name__ == '__main__': 42 add(p(1, 2), p(3, 4).info()) 43 add(D(1, 2, 3), D(1, 2, 3).info()) 44 add(F(2, 3, 4), D(2, 3, 4).info())