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方法

    1. 在call方法里调用Foo类的new方法(负责创建对象)
    2. 执行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
原创粉丝点击