名称简化 ide
cmdb.types.Int 这样名字太长,对用户来说只须要记住最后一个字段便可函数
因此进行约定,cmdb.types 下的int 能够做为type的名称spa
模块一旦加载建立以后,这些类都会放在模块的全局字典中orm
到这里用户能够送入两种名称:rem
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() 进行快速查找到当前模块的全部类
get
找到送进来的短名称cmd
改进代码,将:it
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')
改成:io
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,若是未命中,则向办法建立并加入
form
若是cache存在,那如何判断有想要的类?前提是必须加载才有做用
加入两个方法,将其加载到字典
构建inject函数
def inject():
for name,types in globals().items():
print(name,types)
# 运行函数
inject()
# 查看结果略
经过找到全局获取并判断是否在全局名词空间中,判断传递的信息是否符合当前