@
yunshangdetianya 直接在这里讲好了
很正常的,编程先接触动态语言的话就会很难理解静态语言的接口到底有什么意义,ls 很多人说的其实都对,但都是站在静态语言使用者的角度在教你,你作为一个动态语言接触编程的人是没法轻松理解他们到底在说什么的。因为接口提供的动态能力是动态语言天生就有的,最先接触动态语言的话会把这种动态能力当成呼吸一样理所当然,所以没法理解静态语言这么大费周章是图什么
所以要跟你讲清楚接口,那就要从 python 角度来帮你理解 —— 在 python 中(虽然 python 没接口),接口就相当于在你调用对象的方法时加了一道验证,限制了过于自由类型系统
比如很下面这段 Python 代码是可以直接跑的,但显然会执行出错对不对,因为 123 和 "Hello" 并没有实现 run()方法
```
main.py# 假设 A 和 B 是 class 并实现了 run() 方法
l = [ A(), B(), 123, "Hello" ]
for v in l:
v.run()
```
上面这问题虽然看起来一目了然,但在复杂的代码中是非常容易出现的(代码复杂了你没法保证会不会脑子抽了随便塞个奇怪的变量到上面的 list 里)
那好,你一定就会想,有没有一套聪明办法,让我能限制 l 这个列表只能放实现了 `.run()` 方法的变量?比如像下面这样的伪代码,我自创了一个方法集 RunRunRun:
```
# 定义一个方法集合
method_set RunRunRun:
run()
l[ RunRunRun ] = [ A(), B(), 123, "Hello" ]
# 我这里随便自创了一种写法,指定了列表 l 只能存放实现了方法集 RunRunRun 的变量
# 因为 123 和 "Hello" 没有实现方法集 RunRunRun 里的所有方法,所以这行代码在编写阶段就可以被 IDE 检测出来,并且在编译阶段直接就能报错。而用不着每次到代码跑起来崩了才注意到
```
在上面段伪代码中,方法集(method_set)的另一个通用的叫法就是接口(interface)。这就是接口的用处。这就是站在动态语言角度来理解接口,接口实际上就是在限制动态语言里过于自由的类型赋值。之所以上面很多人说得你不太理解,其实是站在静态语言角度在给你讲。如果你还不太理解的话,就像上面这样理解接口就行了。