名称简化 

cmdb.types.Int   这样名字太长,对用户来讲只需要记住最后一个字段即可

所以进行约定,cmdb.types 下的int 可以作为type的名称

模块一旦加载创建之后,这些类都会放在模块的全局字典中

到这里用户可以送入两种名称:

 

def get_instance(type:str, **option:dict):  # 可以传递cmdb.types.IP 或者 IP
    key = ",".join("{}={}".format(k,v) for k,v in sorted(option.items()))
    key = "{}|{}".format(type,key)
    print(key)

通过globals() 进行快速查找到当前模块的所有类

找到送进来的短名称

改进代码,将:

 

def get_class(type:str):
    cls = classse_cache.get(type)
    if cls:
        return cls

    m, c = type.rsplit('.', maxsplit=1)
    mod = importlib.import_module(m)
    cls = getattr(mod, c)
    classse_cache[type] = cls
    print('cls>>>>',cls)

    if issubclass(cls, BaseType):
        return cls
    raise TypeError('hhhhh')

改为:

 

def get_class(type:str):
    cls = classse_cache.get(type)
    if cls:
        return cls
    m,c = type.rsplit('.', maxsplit=1)
    print(m,c)
    globals().get(type)     # 获取全局名词空间

第一次加载的时候先去找cache,如果未命中,则向办法创建并加入


如果cache存在,那如何判断有想要的类?前提是必须加载才有作用

加入两个方法,将其加载到字典

构建inject函数

 

def inject():
    for name,types in globals().items():
        print(name,types)
# 运行函数
inject()

# 查看结果略

通过找到全局获取并判断是否在全局名词空间中,判断传递的信息是否符合当前