前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python中的依赖注入实现原理

Python中的依赖注入实现原理

作者头像
Python小屋屋主
发布于 2018-04-16 07:12:10
发布于 2018-04-16 07:12:10
6.7K0
举报
文章被收录于专栏:Python小屋Python小屋

依赖注入(Dependency Injection)又称控制反转(Inversion of Control)主要用来实现不同模块或类之间的解耦,可以根据需要动态地把某种依赖关系注入到对象中,使得模块的设计更加独立。同时,依赖注入也是多态的一种实现方式。常用的依赖注入途径有接口注入、Set注入和构造注入三种。另外,反射也属于比较常用的依赖注入技术之一,可以根据给定的不同信息创建不同类型的对象。

(1)接口注入

该技术首先定义一个接口类,然后在继承了该接口的类中实现特定的接口方法,而在接口方法中根据传入参数的不同做出不同的行为。

class Itest: #接口

def injection(self, testClass):

''''''

class Test(Itest): #继承接口

def injection(self, testObject): #实现接口方法

self.object = testObject

def show(self): #普通方法

print(self.object)

class A: #类A和B是测试用的

pass

class B:

pass

t = Test()

t.injection(A()) #传入不同类型的对象

t.show()

t.injection(B())

t.show()

上面代码运行结果为:

<__main__.A object at 0x00000000033F6B70>

<__main__.B object at 0x000000000339B470>

(2)Set注入

这种注入方式是通过类本身提供的一个方法用来注入不同类型的对象来设置自身对象和其他对象的依赖关系。

class Test:

def setObject(self, testObject):#可实现依赖注入

self.object = testObject

def show(self):

print(self.object)

class A:

pass

class B:

pass

t = Test()

t.setObject(A()) #传入不同类型的对象

t.show()

t.setObject(B())

t.show()

(3)构造注入

这种注入方式是在创建类的实例时为构造方法传入不同类型的对象实现的。

class Test:

def __init__(self, testObject): #通过构造方法实现依赖注入

self.object = testObject

def show(self):

print(self.object)

class A:

pass

class B:

pass

t1 = Test(A())#为构造方法传入不同类型的对象

t1.show()

t2 = Test(B())

t2.show()

(4)反射

通过反射技术可以根据传入信息(例如类的名字)的不同来创建不同类型的对象,从而实现多态和依赖注入。

class Animal: #定义一个类

def __init__(self, name):

self.name = name

def show(self):

print(self.name)

class Person(Animal): #继承Animal类,也可以是一个普通的新类

pass

a = globals()['Animal']('dog') #简单形式的反射

a.show()

p = globals()['Person']('Zhangsan') #根据类的名字不同来创建不同的对象

p.show()

下面代码演示了反射的另一种方式:

class Animal: #定义一个类

def __init__(self, name):

self.name = name

def show(self):

print(self.name)

class Person(Animal): #继承Animal类,也可以是一个普通的新类

pass

def createObject(testClass, name):

return testClass(name)

a = createObject(Animal, 'dog') #创建不同类型的对象

a.show()

p = createObject(Person, 'Zhangsan')

p.show()

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文