python class 装饰器

import sys
import os
import functools
import inspect
from collections import defaultdict
import json


def evaluate(filename):
  with open(filename, "r") as evaluate_file:
    return evaluate_file.read()

class Params(object):
  DEFAULT = object()

  def __init__(self, params):
    self.params = params

  def __setitem__(self, key, value):
    self.params[key] = value

  def __getitem__(self, item):
    return self.params[item]

  @classmethod
  def from_file(cls, params_file):
    file_dict = json.loads(evaluate(params_file))
    return cls(file_dict)

  @classmethod
  def from_args(cls, args):
    file_dict = json.loads(args)
    return cls(file_dict)

  def pop(self, key, default=DEFAULT):
    if default is self.DEFAULT:
      try:
        value = self.params.pop(key)
      except KeyError:
        msg = "key {} is required".format(key)
        raise ConfigurationError(msg)
    else:
      value = self.params.pop(key, default)
    return value

def is_base_registrable(cls):
    if not issubclass(cls, Register):
      return False
    method_resolution_order = inspect.getmro(cls)[1:]
    for base_class in method_resolution_order:
      if issubclass(base_class, Register) and base_class is not Register:
        return False
    return True

class FromParams(object):
  @classmethod
  def from_params(cls, params):
    registered_class = Register._registry.get(cls)
    if is_base_registrable(cls) and registered_class is None:
      raise ConfigurationError("tried to construct and abstract Registrable base class that has no registered")

    if registered_class is not None:
      choice = params.pop("type")
      subclass, constructor_name = cls.resolve_class_name(choice)
      args = params.pop("params")
      return subclass(args)
    return None


class ConfigurationError(Exception):
  def __init__(self, message):
    super(ConfigurationError, self).__init__()
    self.message = message

  def __str__(self):
    return self.message

class Register(FromParams):
  _registry = defaultdict(dict)
  @classmethod
  def register(cls, name, constructor=None, exist_ok=False):
    print("cls:", cls)
    registry = Register._registry[cls]
    def add_sbuclass_to_registry(subclass):
      print("sub class:", subclass)
      if name in registry:
        if exist_ok:
          message = ("{} has already been registered as {}, but exist_ok=True, so overwriting with {}".format(name,
                                                                                                              registry[
                                                                                                                name][
                                                                                                                0].__name__,
                                                                                                              cls.__name__))
          print(message)
        else:
          message = (
            "Cannot register {} as {}; name already in use for {}".format(name, cls.__name__,
                                                                          registry[name][0].__name__)
          )
          raise ConfigurationError(message)
      registry[name] = (subclass, constructor)
      return subclass
    return add_sbuclass_to_registry

  @classmethod
  def resolve_class_name(cls, name):
    if name in Register._registry[cls]:
      subclass, constructor = Register._registry[cls].get(name)
      return subclass, constructor
    else:
      # is not a qualified class name
      raise ConfigurationError(
        "{} is not a registered name for {}. ".format(name, cls.__name__)
      )


class Model(Register):
  def __init__(self, params):
    print("Model init params:",params)


@Model.register("IrisModel")
class IrisModel(Model):
  def __init__(self, params):
    super(IrisModel, self).__init__(params)
    print("IrisModel Init")

json_conf = '''
 {"type" : "IrisModel",
  "params" : {
 "name" : "like",
 "reader" : "reader"
 }
 }
'''
params = Params.from_args(json_conf)
model = Model.from_params(params)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝鲸123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值