思路:
用一个字典存储beanName和资源
初始化时先将beanName和资源注册到字典中
然后用一个Dscriptor类根据beanName动态请求资源,从而实现控制反转
# -*- coding:utf-8 -*-
import os
class BeanFactory:
"""
Python版控制反转
context: 存储bean的名字和对应的类或者值的字典
allowRepalce: 是否允许替换已经注入的bean
"""
def __init__(self,allowReplace=False):
"""构造函数
allowReplace:是否允许替换已经注入的bean
"""
self.context = {}
self.allowReplace = allowReplace
def setBean(self,beanName,resource,*args,**kwargs):
if not self.allowReplace:
assert not beanName in self.context,"该BeanFactory不允许重复注入%r,请修改beanName" % beanName
def call():
"""定义一个函数闭包,如果注入的resource是可调用类型,就将*args和**kwargs传入并调用该函数,然后将返回值返回
如果是一个不可调用对象,就直接返回
"""
if callable(resource):
return resource(*args,**kwargs)
else:
return resource
#将call闭包与beanName建立映射
self.context[beanName]=call
def __getitem__(self,beanName):
"""重载__getitem__方法,使得BeanFactory支持使用[]获取beanName对应的注册的资源
"""