Python中接口定义和依赖注入
2017-07-27 19:51
706 查看
首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束
在其他的语言里,比如Java,继承类没有重写接口方法是会报错的,而在python里不会,就是因为python没这个类型,所以只是在我们编程过程的一个规定,以I开头的类视为接口
Python支持多继承,但是不支持接口,zope.inteface是其三方的接口实现库,在twisted中有大量使用
from zope.interface import Interface
from zope.interface import implementer
import socket
class IHostNameResolver(Interface):
def getHostByName(name, timeout = (1, 3, 11, 45)): # 可以不用self
"""
Resolve the domain name C{name} into an IP address.
"""
"""
类装饰器等价于:implementer(IHostNameResolver)(HostNameResolver)
"""
@implementer(IHostNameResolver)
class HostNameResolver:
def getHostByName(self, name, timeout = (1, 3, 11, 45)):
try:
address = socket.gethostbyname(name)
except socket.error:
return 'none'
else:
return address
resolver = HostNameResolver()
print resolver.getHostByName('localhost')
# 判断HostNameResolver是否实现了接口IHostNameResolver
print IHostNameResolver.implementedBy(HostNameResolver) # True, 调用 SpecificationBasePy.implementedBy()
首先我们先看一个普通的类:
执行Foo类的__init__方法(初始化)
了解其中的原理,我们就可以在__call__里面大做文章啦
如果要熟练应用依赖注入,我还要弄懂一个概念,那就是组合:组合的目的就是解耦,减少依赖性,原来以某个具体的值或对象传入到内部改成以参数的形式传入
比如:在实例Bar对象时,封装Foo对象,实例Foo对象封装Head对象,就用参数的形式传入到构造方法里
python的类是可以写任意个方法的
定义一个接口对继承类进行约束,接口里有什么方法,继承类就必须有什么方法,接口中不能任何功能代码
抽象类,抽象方法
抽象类,可以说是类和接口的混合体,既可以定义常规方法,也可以约束子类的方法(抽象方法)
from zope.interface import Interface
from zope.interface import implementer
import socket
class IHostNameResolver(Interface):
def getHostByName(name, timeout = (1, 3, 11, 45)): # 可以不用self
"""
Resolve the domain name C{name} into an IP address.
"""
"""
类装饰器等价于:implementer(IHostNameResolver)(HostNameResolver)
"""
@implementer(IHostNameResolver)
class HostNameResolver:
def getHostByName(self, name, timeout = (1, 3, 11, 45)):
try:
address = socket.gethostbyname(name)
except socket.error:
return 'none'
else:
return address
resolver = HostNameResolver()
print resolver.getHostByName('localhost')
# 判断HostNameResolver是否实现了接口IHostNameResolver
print IHostNameResolver.implementedBy(HostNameResolver) # True, 调用 SpecificationBasePy.implementedBy()
依赖注入
首先我们先看一个普通的类:首先要明确的是,在python里,一切事物皆为对象
而所有的类都是对象,默认是由type创建
创建类的执行流程:遇到class关键词,执行type的__init__方法,创建Foo类这个对象
遇实例化对象(obj=Foo()),执行type里的__call__方法
在call方法里调用Foo类的__new__方法(负责创建对象)执行Foo类的__init__方法(初始化)
了解其中的原理,我们就可以在__call__里面大做文章啦
比如:在实例Bar对象时,封装Foo对象,实例Foo对象封装Head对象,就用参数的形式传入到构造方法里
相关文章推荐
- 一篇能很好反映普通接口多态 工厂模式 依赖注入三者的耦合强度区别的文章
- 从针对接口编程到依赖注入
- MVC3使用Unity实现依赖注入接口与于实现类自动注册
- DI容器Ninject在管理接口和实现、基类和派生类并实现依赖注入方面的实例
- Spring的依赖注入(接口注入)
- 从针对接口编程到依赖注入
- 【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
- Spring依赖注入与配合接口编程案例
- python 调用dll中参数为BYTE的函数(注意接口定义的格式)
- Struts2_11_struts访问web元素2利用struts提供的三个接口_IoC控制反转设计思想/DI依赖注入
- 从针对接口编程到依赖注入
- 在.NET Core中处理一个接口多个不同实现的依赖注入问题
- python接口的定义
- caffe的python接口下,数据层的定义,均值文件的转化
- 关于spring容器依赖注入接口的小问题
- 从针对接口编程到依赖注入
- 一篇能很好反映普通接口多态 工厂模式 依赖注入三者的耦合强度区别的文章
- Spring(4)-IOC-Spring的核心机制:依赖注入(面向接口)
- 依赖注入的正式定义
- Spring中IoC两种接口和两种依赖注入方式的比较