接口, (按照我自己的理解)最接地气的定义是: 实体向外暴露的公共可访问方法与属性. 这个实体可以是Class, Object, Software等任意可以看成一个整体的东西. 外界通过它们的interface与它们进行交互.
按照Wikipedia的说法, 接口与协议(Protocol)是同义词, 因为接口在定义交互方式的同时肯定也定义了交互时的通信内容, 格式等.
Java里的Interface是一种特殊的类. 要兼容某种协议, 就要implements
相应的interface
. 例如, 序列化协议Serializable
, 比较/排序协议Comparable
.
而在Python里, 不是通过implements
接口类来兼容特定协议, 而是只需通过实现特定的方法. 例如, 只需要实现__getitem__
方法, 就可以支持索引操作: obj[idx]
, 实现__hash__
方法就可以支持Hash操作.
用Fluent Python里的话来讲, 要判断一个动物是不是鸭子, Java看的是它的血统: 是否实现了鸭子接口, 是一个鸭子实例; Python则是看它的行为: 是否像鸭子一样走路, 一样叫发声.
Java是静态类型语言, 在编译时就可以通过类型检查知道某调用是否合法, 例如是否可序列化. Python是动态类型语言, 加上可在运行时给Object/Class动态添加方法/属性(即Monkey Patching), 在运行时才能知道调用是否合法.
存在差异, 优劣之分则是乐山乐水.
Java是强类型语言… Python是弱类型语言
已经修改。
感谢@计算机动物 的指正, 查了资料才发现本人之前理解的强弱类型概念是错误的。
https://www.zhihu.com/question/19918532