您的位置:首页 > 编程语言 > Python开发

Python中接口定义和依赖注入

2017-07-27 19:51 706 查看
首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束

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()


依赖注入

首先我们先看一个普通的类:

首先要明确的是,在python里,一切事物皆为对象

而所有的类都是对象,默认是由type创建

创建类的执行流程:

遇到class关键词,执行type的__init__方法,创建Foo类这个对象

遇实例化对象(obj=Foo()),执行type里的__call__方法

在call方法里调用Foo类的__new__方法(负责创建对象)
执行Foo类的__init__方法(初始化)

了解其中的原理,我们就可以在__call__里面大做文章啦

  如果要熟练应用依赖注入,我还要弄懂一个概念,那就是组合:组合的目的就是解耦,减少依赖性,原来以某个具体的值或对象传入到内部改成以参数的形式传入

  比如:在实例Bar对象时,封装Foo对象,实例Foo对象封装Head对象,就用参数的形式传入到构造方法里

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: