1. 程式人生 > 其它 >註冊機制(Registry)

註冊機制(Registry)

1. 概述

在Detectron2 中,經常對一個類或函式進行註冊,這裡舉個例子方便大家理解註冊機制。

from fvcore.common.registry import Registry
# 建立一個Registry物件
registry_machine = Registry('registry_machine')
# 註冊
@registry_machine.register()
def print_hello_world(word):
    print(word)
# 其中cfg為所呼叫的函式名/類名
cfg = "print_hello_world"
# 相當與呼叫print_hello_world('hello world')
registry_machine.get(cfg)('hello world')

如果建立了一個Registry的物件,並在方法/類定義的時候用裝飾器裝飾它,則可以通過 registry_machine.get(方法名) 來間接呼叫被註冊的函式

2. 註冊機制的好處

使用註冊機制的好處:程式碼的可擴充套件性變強
對於detectron2這種,需要支援許多不同模型的大型框架,理想情況下所有的模型的引數都希望寫在配置檔案中,那問題來了,如果我希望根據我的配置檔案,決定我是需要用VGG還是用ResNet ,我要怎麼寫?
如果是我,我可能會寫出這種可擴充套件性超級低的暴搓的程式碼:

if class_name == 'VGG':
    model = build_VGG(args)
elif class_name == 'ResNet':
    model = build_ResNet(args)

但是如果用了註冊類,程式碼就是這樣的:

model = model_registry(class_name)(args)

原文連結

https://zhuanlan.zhihu.com/p/93835858