python 装饰器
关于python 闭包、装饰器的介绍,可以先看廖雪峰的介绍
这里主要介绍上文中没有提到的部分。
利用装饰器,来完成类和函数的自动注册。
看下面的代码:
class Test:
def __init__(self):
print("test created")
def __call__(self):
print("test called")
A = Test()
test created
但是我们很多时候需要根据情形来选择实例化的类,就希望类可以自动完成注册,以方便调用。
#装饰器代码
models = {}
def register_model(model):
def decorator(**args):
models[model.__name__] = model
return model
return decorator
def get_model(name,**args):
net = models[name](**args)
return net
这时候有
@register_model
class Test:
def __init__(self):
print("test created")
def __call__(self):
print("test called")
这样通过实例化Test的时候,就完成了自动注册。
需要注意的是,
- 当实例化注册的时候,
a = Test()
,类并没有立刻实例化,而是延迟的。 - 上面的装饰器的代码是针对单例的。
此时:
a = Test() #没有任何输出
print(models)
func =get_model("Test")
{'Test': <class '__main__.Test'>}# print test created
import时注册
受益于python的import机制。在import一个py文件时,会触发注册器。从而在代码实际执行前完成注册行为
models.py
models = {}
def register_model(name):
def decorator(cls):
models[name] = cls
return cls
return decorator
def get_object(name, **args):
net = models[name](**args)
return net
Test.py
from models import register_model, get_object
@register_model("Test")
class Test:
def __init__(self):
print("test created")
def __call__(self):
print("test called")
return 0
main.py
from models import get_object
from testclass import Test
get_object('Test')()
test created
test called