多态和抽象类

抽象类和接口类

抽象类和接口类做的事情:建立规范

开放封闭原则

​ 开放:对扩展是开放的

​ 封闭:对修改是封闭的

归一化设计:

​ 不管哪一个类的对象,都调用一个函数去完成相同的功能

​ 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())

猜你喜欢

转载自www.cnblogs.com/kuoiea/p/8857016.html