现在好多项目都会用到registry机制,学习一下
简单来说registry可以提供字符串到python中类的映射,registry能让开发者输入相应的类名和参数,就能获得一个初始化好的类。
也就是说像是这样,下面这是一个类:
class aclass(object):
def __init__(self):
...
def ...
...
然后通过registry获取类:
cfg=dict(type="aclass")
aclass=registry(cfg)
这样就通过字符串获取到了类接口了,下面笔者以mmcv中的registry为例子讲解registry机制,python中的其他工具箱中的registry机制也是大同小异的。
首先创建一个目录,随意取个名字code,在code下再创建一个目录,名为registry,在这个目录下创建一个名为builder的python文件,代码如下:
from mmcv import Registry
from mmcv.utils.registry import build_from_cfg
CLASS=Registry("class_test")
在这里我们创建了一个名为class_test的注册表,其中Registry的参数如下
name (str): 注册表的名字
build_func(func, optional):构造类接口的函数,简单来说就是用来后续处理获取初始化类的函数,
mmcv提供了一个build_from_cfg的函数,只需要建立一个字典,然后type=需要调用的类名,然后正
常的参
数的键值对输入就可以得到一个用自己配置参数获取的初始化的类了。当然也可以自己写。
parent (Registry, optional): 父注册表,如果没有指定build_func,就调用父注册表里面的,当然
父注册表里面的接口也是可以继承的
然后在registry目录中创建一个名为class_test的python文件,代码如下:
from .builder import CLASS
@CLASS.register_module()
class test(object):
def __init__(self,n):
self.n=n
def printf(self):
print(self.n)
我们在这里定义了一个类,@CLASS.register_module()的作用是将我们这个类放入CLASS注册表里面,只要在@CLASS.register_module()下写入一个类就可以将这个类放入我们创建的注册表里面了。
然后在registry中创建一个__init__.py文件,将我们的registry变成一个python包,这是必要的。代码如下:
from .builder import CLASS
from .class_test import test
__all__=["CLASS","test"]
这样我们的注册表就创建完成了,赶紧实验以下,在code目录下创建一个test python文件,代码如下:
from Registry import CLASS
cfg = {"type":'test',"n":10}
test=CLASS.build(cfg)
test.printf()
在这里我们通过build方法创建好了一个初始化好了的test类,然后调用printf方法打印n。
以上就是registry机制的用法了,在一些比较大的项目中经常会用到,码字不易,喜欢的朋友可以点一个赞哦。