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

posted @ 2021-07-14 23:13  青铜时代的猪  阅读(371)  评论(0编辑  收藏  举报