defregister(self, target): defadd_item(key, value): ifnotcallable(value): raise Exception(f"Error:{value} must be callable!") if key in self._dict: print(f"\033[31mWarning:\033[0m {value.__name__} already exists and will be overwritten!") self[key] = value return value
@my_register defcustom_op(a, b): return a * b + a + b
if __name__ == '__main__': # check register information for k, v in my_register.items(): print(f"key: {k}, value: {v}") print()
# math open num1, num2 = 1, 2 for func_name, func in my_register.items(): print(f"{func_name} for {num1} and {num2}: ", func(num1, num2))
输出:
key: add, value: <function add at 0x104777d90>
key: multiply, value: <function multiply at 0x104939d80>
key: matrix multiply, value: <function mul_multiply at 0x10493a440>
key: minus, value: <function minus at 0x10493a3b0>
key: custom_op, value: <function custom_op at 0x104939cf0>
add for 1 and 2: 3
multiply for 1 and 2: 2
matrix multiply for 1 and 2: None
minus for 1 and 2: -1
custom_op for 1 and 2: 5
def__setitem__(self, key, value): ifnotcallable(value): raise Exception(f"Value of a Registry must be a callable!\nValue: {value}") if key isNone: key = value.__name__ if key in self._dict: print("Key %s already in registry %s." % (key, self._name)) self._dict[key] = value
def__contains__(self, key): return key in self._dict
defkeys(self): """key""" return self._dict.keys()
defitems(self): return self._dict.items()
实际中对类使用注册器:
from class_register import Register
class Registers:
model = Register('model')
dataset = Register('dataset')
class Model:
pass
@Registers.model
class Model1(Model):
pass
@Registers.model
class Model2(Model):
pass
@Registers.model
class Model3(Model):
pass
@Registers.dataset
class Dataset1:
pass
print(Registers.model.items())
print(Registers.dataset.items())