python依赖注入
来源:互联网 发布:厦门大学网络教育报名 编辑:程序博客网 时间:2024/06/05 06:50
python依赖注入
定义
- 依赖注入是通过类的构造函数、方法、或者属性直接写入的方式,将所依赖的组件传递给类的方式,一般情况,构造函数注入的是强依赖关系的组件,setter针对可选的依赖组件
类的创建相关知识
例子
class Foo(object): def __init__(self): self.name = 'alex' def f1(self): print(self.name)
- python里,一切事物皆为对象、所有类都是对象,默认都是type创建
- 创建类的时候,遇到class关键字,执行type的init方法,创建类对象,这里创建Foo类对象
遇到实例化对象 (如 obj = Foo()),执行type里的call方法
- 在call方法里调用Foo类的new方法(负责创建对象)
- 执行Foo类的init方法(初始化)
如果不懂,可以跟踪调试以下例子
# -*- coding=utf-8 -*-class MyType(type): def __call__(cls, *args, **kwargs): obj = cls.__new__(cls, *args, **kwargs) print(u'在这里面..') obj.__init__(*args, **kwargs) return objclass Foo(object): __metaclass__ = MyType def __init__(self): self.name = 'alex'if __name__ == '__main__': f = Foo() print(f.name)output:在这里面..alex
依赖注入
- 如果要熟练应用依赖注入,我还要弄懂一个概念,那就是组合, 组合的目的就是解耦,减少依赖性,原来以某个具体的值或对象传入到内部改成以参数的形式传入
- 比如:在实例Bar对象时,封装Foo对象,实例Foo对象封装Head对象,就用参数的形式传入到构造方法里
# -*- coding=utf-8 -*-class Mapper(object): # 在字典里定义依赖注入关系 __mapper_relation = {} # 类直接调用注册关系 @staticmethod def register(cls, value): Mapper.__mapper_relation[cls] = value @staticmethod def exist(cls): if cls in Mapper.__mapper_relation: return True return False @staticmethod def get_value(cls): return Mapper.__mapper_relation[cls]class MyType(type): def __call__(cls, *args, **kwargs): obj = cls.__new__(cls, *args, **kwargs) arg_list = list(args) if Mapper.exist(cls): value = Mapper.get_value(cls) arg_list.append(value) obj.__init__(*arg_list, **kwargs) return objclass Head(object): def __init__(self): self.name = 'alex'class Foo(object): __metaclass__ = MyType def __init__(self, h): self.h = h def f1(self): print(self.h)class Bar(object): __metaclass__ = MyType def __init__(self, f): self.f = f def f2(self): print(self.f)if __name__ == '__main__': Mapper.register(Foo, Head()) Mapper.register(Bar, Foo()) head = Mapper.get_value(Foo) print '1111111' print head print head.name print '2222222' foo = Mapper.get_value(Bar) print foo print foo.h.name print '3333333' b = Bar() print(b.f) print b.f.h.name# output:1111111<__main__.Head object at 0x00000000026CF390>alex2222222<__main__.Foo object at 0x00000000026CF438>alex3333333<__main__.Foo object at 0x00000000026CF438>alex
阅读全文
0 0
- python依赖注入
- Python中接口定义和依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- 依赖注入
- pat1006
- Myeclipse运行程序时出现Console没有输出信息(只有<terminate>...)解决方法
- pat1007
- 深入理解Django中的ORM数据库操作(Django系列1)
- pat1008
- python依赖注入
- iOS【webView 加载微信文章注入JS实现交互 浏览图片及保存】
- pat1014
- rabin-karp 算法学习心得-lintcode 594
- Web安全笔记整理
- 实战6.SparkSQL(中)--深入了解SparkSQL运行计划及调优
- 复杂度
- iOS【开发即时通讯 SocketIO
- 实战6.SparkSQL(下)--Spark实战应用