首先先举一个例子:
小明是一名数学老师,现在他有一群会python编程的学生,小明现在在课堂上布置了一项作业,要求同学们用python编写程序来画自己喜欢的形状并计算形状的面积(规定大小必须可变)
学生A:小红----喜欢:圆形
学生B:小李----喜欢:正方形
学生C:小蓝----喜欢:三角形
小红编程能力较好,看到大小必须可变一下子就想到了要用面向对象编程的思想,用类来实现(由于如果仅使用函数无法将其包装起来,显得代码较为杂乱无章),所以小红最终提交的代码如下:
class Circle:
def __init__(self, radius):
self.radius = radius
def draw(self):
print("Drawing a circle")
def calculate_area(self):
return 3.14 * self.radius * self.radius
小李和小蓝编程能力较弱,学习了小红的编程思想,也类比着写了 正方形和三角形的 类,代码如下:
class Square:
def __init__(self, side_length):
self.side_length = side_length
def draw(self):
print("Drawing a square")
def calculate_area(self):
return self.side_length * self.side_length
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def draw(self):
print("Drawing a rectangle")
def calculate_area(self):
return self.width * self.height
最后小明老师看到大家写的代码后,
小明老师问了一句:同学们,你们觉得这几段代码都有什么共同之处吗?
小红回答:老师类都是实现了画自己喜欢形状和计算自己喜欢的形状的面积
小明老师又问:那如果明天我继续让你们用python来编写”你们喜欢的动物,并让动物发出不同叫声,又让你们编写你们喜欢的天气,并描述天气的特点......“等等,最后学期末我要用给你们的需求一起实现一个集成于一体的功能,我是把你们的代码都copy后放到一个py文件然后需要一个特定的类我就创建一下吗?这样太麻烦了,有没有更好的方法呢?
小蓝灵光一闪,说到:老师,可以把你布置的这些作业都分门别类,再抽象一层,然后你每次要用到你每天布置的作业的特定内容时你只需要找到这个更上一层的抽象就可以了,比如画形状就是Shape,动物就是Animal,天气状况就是Weather
小明老师会心一笑:不错不错,这就是我今天要引出的点,我们通常把 小蓝同学说到的这个 “再抽象一层” 叫做接口,在我布置作业时呢,实际上我就规定了每个类要固定实现哪些功能,这就是要实现接口的一个特性,代码的规范化,而我就相当于是站在接口的角度上给你们提的要求,这里的Shape接口就可以写成如下代码:
# 定义Shape接口
class Shape:
def draw(self):
pass
def calculate_area(self):
pass
# Circle类实现Shape接口
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def draw(self):
print("Drawing a circle")
def calculate_area(self):
return 3.14 * self.radius * self.radius
# Rectangle类实现Shape接口
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def draw(self):
print("Drawing a rectangle")
def calculate_area(self):
return self.width * self.height
# 使用Shape接口
shapes = [Circle(5), Rectangle(4, 6)]
for shape in shapes:
shape.draw()
area = shape.calculate_area()
print("Area:", area)
这里随机取出Circle类来讲一下这个代码的意思:Circle类通过继承Shape类来实现Shape接口。通过将Shape作为参数传递给Circle类的定义,我们表明Circle类是Shape类的一个特殊类型,它承担了实现Shape接口的责任
小蓝同学又要问:那这和写类有什么区别呢,你看调用方式都差不多,代码还多了一段接口的代码
小明老师:如果现在我一直教学这个班,未来有更多同学进来,我一样要他们实现这些任务(画喜欢的形状并计算面积),但是我已经讲过了接口,那我只需要给他们写好的接口,然后他们按照我的接口去实现类即可,这样不仅能使大家的代码更加规范化和统一,还能方便我来查看你们喜欢的形状都有哪些,计算结果是否正确,这就是接口的意义,即站在一个领导者的角度来布置编程需求