Python中的Register(注册器)模块,Registry(注册机制)的讲解及示例
文章目录
- 前言
- 为什么使用`Register`或`Registry`?
- `Register`机制怎么用?
- 定义`Register`
- 使用`Register`
- 使用装饰器注册模块
- 将Register实例化,使用Register
- 总结
前言
在之前接触到的一些比较大的开源工作中,如timm,detectron2,mmlab等项目,常常会遇见Register
或Registry
模块,中文称之为注册器
或注册机制
。本篇Blog梳理一下注册器模块的使用机制,以及探讨为何要使用该模块。
为什么使用Register
或Registry
?
在常见的CV模型中,例如分类、检测、分割等任务中,针对一个模型,(例如Faster-RCNN),可能在一个Head的基础上换多个Backbone(例如ResNet,DenseNet等)。或者说针对一套模型,可能会跑多个数据集。最简单的实现方式就是有多套代码,每套代码仅在Backbone部分或数据加载部分有差异。但是这样而言对于一个大型项目来说会过于繁琐,不够简洁,每新增一个新的模型,需要手动维护很多代码。因此,许多项目都使用了Register
注册器机制。
使用Register
注册器机制可以让项目易于扩展,当产品增加某个功能需要增加一些新函数或者类时,它可以保证我们可以复用之前的逻辑。
Register
机制怎么用?
定义Register
首先我们需要定义一个注册器的Class
,我们这里直接引用Python中的注册器模块的代码,代码示例如下所示:
class Register:def __init__(self, registry_name): # 可以将Register视为一个`dict`self._dict = {}self._name = registry_namedef __setitem__(self, key, value):if not callable(value):raise Exception(f"Value of a Registry must be a callable!\nValue: {value}")if key is None:key = value.__name__if key in self._dict:logging.warning("Key %s already in registry %s." % (key, self._name))self._dict[key] = valuedef register(self, target):"""Decorator to register a function or class."""# 关键函数,可以作为装饰器,注册一个函数或者一个类别。def add(key, value):self[key] = valuereturn valueif callable(target):# @reg.registerreturn add(None, target)# @reg.register('alias')return lambda x: add(target, x)def __getitem__(self, key):return self._dict[key]def __contains__(self, key):return key in self._dictdef keys(self):"""key"""return self._dict.keys()
使用Register
使用装饰器注册模块
首先补充一个知识点,@是python的装饰器语法糖。
@decorate
def func():pass
#! 等价于func = decorate(func)
则使用Register
时,可以用装饰器的方法来使用,示例如下所示:
# Define Register_func
Register_func = Register()
@Register_func.register
class Modle1:
等价于Register_func.register(Model1)
,最终执行的是add(None, Model1)
而
@Register_func.register("model_one")
class Model1:
等价于Register_func.register("model_one")(Model1)
,最终执行的是add("model_one", Model_1)
。
简而言之,Register
类提供了方便的注册器来对模块进行注册。
将Register实例化,使用Register
为了更好的展示使用方式,我们定义一些简单的函数,例如加减乘除等函数,为了省略重复代码,我们就直接给他们用Register注册了。
代码示例如下所示:
注册Register。
Register_func = Register("Register_func") @Register_func.register
def add(x,y):return x+y@Register_func.register
def minus(x,y):return x-y@Register_func.register
def multi(x,y):return x*y@Register_func.register
def div(x,y):return x/y
使用注册模块。
operation = Register_func["add"]
result = operation(1,2)
print(result)
总结
以上是最最基础的Register
的使用方式,后续有更多有关Register
的使用花活会增添到本内容中。
Python中的Register(注册器)模块,Registry(注册机制)的讲解及示例相关推荐
- Python中常用的数据分析工具(模块)有哪些?
本期Python培训分享:Python中常用的数据分析工具(模块)有哪些?Python本身的数据分析功能并不强,需要安装一些第三方的扩展库来增强它的能力.我们课程用到的库包括NumPy.Pandas. ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- python中的函数修饰器
python中的函数修饰器 – @wrapper 简介 类似于C#的属性.Java的注解,python也有对应的修饰符.从Python2.7和Python3开始,提供了以'@'为标示的修饰符,可以在模 ...
- Python中的decorator装饰器使用方法
装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...
- Python中计算程序的运行时间——timeit模块
Python中计算程序的运行时间--timeit模块 绪论 一.timeit的基本用法 1.1 timeit.timeit()函数: 创建一个Timer实例,并运行代码进行计时,默认将代码执行一百万次 ...
- 学习记录2-Python中的注册器模块
简介 在一个稍大一点的python项目中,我们很有可能会用到注册器(register).这个注册器不是用户账号注册的模块,而是项目中注册模块的一个模块.举个例子,一个深度学习项目可能支持多种模型:具体 ...
- Python中操作mysql的pymysql模块详解
前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11. ...
- python中的装饰器有哪些-Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法. 在Python中完全支持定义类方法.静态方法.这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以). 区别在于:Pyt ...
- Python中os与sys两模块的区别
<os和sys的官方解释> ➤os os: This module provides a portable way of using operating system dependent ...
最新文章
- Object-C---gt;Swift之(八)类和结构体
- leetcode每日刷题计划-简单篇day8
- 下面我将随机抽取一名幸运女生,XXXXX
- latex使用小记录
- MQ消息队列产品测试
- 2016陕西省ACM省赛 HE 字符串处理 删除注释
- Fix “Windows cannot access the specified device path or file” Error
- Java进阶:SSM(Spring、Spring MVC、MyBatis)整合
- 武汉大学953计算机综合真题,武大电力系统分析实验报告.docx
- echarts柱状图图例设置
- js逆向-1 模拟登陆微信公众号平台
- 【雷达与对抗】【2013.12】一种紧凑型超宽带雷达系统
- 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary
- 磁珠 符号_(整理)贴片磁珠规格
- maximo工作流底色更改
- 读叔本华之《人生的智慧》
- java-net-php-python-jsp健身俱乐部管理系统演示录像计算机毕业设计程序
- 机器学习准备数据时如何避免数据泄漏
- Educational Codeforces Round 132 A - D
- 【转载】解决不能添加GOOGLE账户的问题!(付安装教程)