鸭子类型
封装
封装指的就是把数据与功能都整合到一起
听起来是不是很熟悉,没错,我们之前所说的”整合“二字其实就是封装的通俗说法。
除此之外,针对封装到对象或者类中的属性,我们还可以严格控制对它们的访问,分两步实现:隐藏与开放接口
继承
继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,新建的类可称为子类或派生类,父类又可称为基类或超类
多态
多态指的是一类事物有多种形态,比如动物有多种形态:猫、狗、猪
java 接口
接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成,接口是解决java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。
接口的特点
就像一个类一样,一个接口也能够也有方法和属性,但是在接口中声明的方法默认是抽象的(即只有方法标识符,而没有方法体)
- 一个类实现这个接口必须实现这个接口中定义的所有的抽象方法
- 接口指明了一个类必须做什么和不能做什么
- 一个接口就是描述一种能力,比如"运动员"也可以作为一个接口,并且如何实现"运动员"接口的类必须能力实现奔跑这个动作,所以接口的作用就是告诉类,你要实现我这种接口代表的功能,你就必须实现某些方法,我才能承认你确实拥有该接口代表的某种能力。
- 抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,既有方法体的方法。接口是百分之百的抽象类
为什么要用接口
1、接口被用来描述一种抽象
2、因为java不像c++一样支持多继承,所以java可以通过实现接口来弥补这个局限
3、接口也被用来实现解耦
4、接口被用来实现抽象,而抽象类也被用来实现抽象,为什么一定要用接口呢?接口和抽象类之间又有什么区别呢?原因是抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的
go 接口
在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为,接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定
在Go语言中,当一个类型定义了接口中的所有方法,我们称它实现了该接口。接口指定了一个类型应该具有的方法,并由该类型决定如何实现这些方法。
例如,WashingMachine 是一个含有 Cleaning() 和 Drying() 两个方法的接口。任何定义了 Cleaning() 和 Drying() 的类型,都称它实现了 WashingMachine 接口。
go 多态
Go通过接口来实现多态,在go语言中,是隐式的实现接口,一个类型如果定义了接口所声明的全部方法,那它就实现了该接口。
一个类型如果定义了接口的所有方法,那它就隐式的实现了该接口
所有实现了接口的类型,都可以把它的值保存在一个接口类型的变量中,在Go中,我们使用接口的这种特性类实现多态。
python 鸭子类型
https://zhuanlan.zhihu.com/p/109334326
多态性
多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象,这就需要在设计时,把对象的使用方法统一成一种:例如cat、dog、pig都是动物,但凡是动物肯定有talk方法
协议
在面向对象编程中,协议是非正式的接口,是一组方法,是由文档和约定定义,因此,协议不能像正式接口那样施加强制性约束,而python的哲学就是尽量支持基本协议。
鸭子类型
是动态类型的一种风格,不管对象属于哪个,也不管声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上执行操作。即忽略对象的真正类型,转而关注对象有没有实现所需的方法、签名和语义.
python语言没有interface关键字,就是说,python里面没有java,go一样的接口
如果想编写现有对象的自定义版本,可以继承该对象,也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
举例
这里有两个类,一个是文本文件类,一个是硬盘类,这两个类都有两个与文件操作类型同名的方法,即read和write,这二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
#二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
class Txt: #Txt类有两个与文件类型同名的方法,即read和write
def read(self):
pass
def write(self):
pass
class Disk: #Disk类也有两个与文件类型同名的方法:read和write
def read(self):
pass
def write(self):
pass