文章目录

  • 前言
  • 为什么使用`Register`或`Registry`?
  • `Register`机制怎么用?
    • 定义`Register`
    • 使用`Register`
      • 使用装饰器注册模块
      • 将Register实例化,使用Register
  • 总结

前言

在之前接触到的一些比较大的开源工作中,如timm,detectron2,mmlab等项目,常常会遇见RegisterRegistry模块,中文称之为注册器注册机制。本篇Blog梳理一下注册器模块的使用机制,以及探讨为何要使用该模块。

为什么使用RegisterRegistry

在常见的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(注册机制)的讲解及示例相关推荐

  1. Python中常用的数据分析工具(模块)有哪些?

    本期Python培训分享:Python中常用的数据分析工具(模块)有哪些?Python本身的数据分析功能并不强,需要安装一些第三方的扩展库来增强它的能力.我们课程用到的库包括NumPy.Pandas. ...

  2. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  3. python中的函数修饰器

    python中的函数修饰器 – @wrapper 简介 类似于C#的属性.Java的注解,python也有对应的修饰符.从Python2.7和Python3开始,提供了以'@'为标示的修饰符,可以在模 ...

  4. Python中的decorator装饰器使用方法

    装饰器的运用是Python编程中的一项高级技巧,这里由浅入深,整理了12步入门Python中的decorator装饰器使用方法,需要的朋友可以参考下 装饰器(decorator)是一种高级Python ...

  5. Python中计算程序的运行时间——timeit模块

    Python中计算程序的运行时间--timeit模块 绪论 一.timeit的基本用法 1.1 timeit.timeit()函数: 创建一个Timer实例,并运行代码进行计时,默认将代码执行一百万次 ...

  6. 学习记录2-Python中的注册器模块

    简介 在一个稍大一点的python项目中,我们很有可能会用到注册器(register).这个注册器不是用户账号注册的模块,而是项目中注册模块的一个模块.举个例子,一个深度学习项目可能支持多种模型:具体 ...

  7. Python中操作mysql的pymysql模块详解

    前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11. ...

  8. python中的装饰器有哪些-Python中的@函数装饰器到底是什么?

    在解释@函数装饰器之前,先说一下,类中的类方法和静态方法. 在Python中完全支持定义类方法.静态方法.这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以). 区别在于:Pyt ...

  9. Python中os与sys两模块的区别

    <os和sys的官方解释> ➤os os: This module provides a portable way of using operating system dependent ...

最新文章

  1. Object-C---gt;Swift之(八)类和结构体
  2. leetcode每日刷题计划-简单篇day8
  3. 下面我将随机抽取一名幸运女生,XXXXX
  4. latex使用小记录
  5. MQ消息队列产品测试
  6. 2016陕西省ACM省赛 HE 字符串处理 删除注释
  7. Fix “Windows cannot access the specified device path or file” Error
  8. Java进阶:SSM(Spring、Spring MVC、MyBatis)整合
  9. 武汉大学953计算机综合真题,武大电力系统分析实验报告.docx
  10. echarts柱状图图例设置
  11. js逆向-1 模拟登陆微信公众号平台
  12. 【雷达与对抗】【2013.12】一种紧凑型超宽带雷达系统
  13. 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary
  14. 磁珠 符号_(整理)贴片磁珠规格
  15. maximo工作流底色更改
  16. 读叔本华之《人生的智慧》
  17. java-net-php-python-jsp健身俱乐部管理系统演示录像计算机毕业设计程序
  18. 机器学习准备数据时如何避免数据泄漏
  19. Educational Codeforces Round 132 A - D
  20. 【转载】解决不能添加GOOGLE账户的问题!(付安装教程)

热门文章

  1. 趁着课余时间学点Python(十二)面向对象的理解(结局)
  2. 左值、右值、右值引用、移动、引用坍缩和完美转发
  3. arcgis 调取天地图poi兴趣点
  4. 架构中重大风险的发掘过程
  5. LG无缘苹果面板供应之争 2018年押注OLED胜算几何
  6. http请求状态码为返回405
  7. 列表、表格、表单思维导图
  8. python颜色参数palette_python数据可视化seaborn(一)—— 整体样式与调色板
  9. setfill和setw总结
  10. 亚马逊全球开店运营不能触碰的红线