有没有办法制作元函数/元初始化器?

时间:2018-08-15 00:54:13

标签: python python-3.x initialization

我在学习元类时编写了这段小代码,该类只是将我所有的类文档注册到具有给定元类的所有类的全局变量中:

docs = {}

def register_docs(cls):
    docs[cls.__name__] = cls.__doc__

class Meta(type):
    def __new__(meta, name, bases, class_dict):
        cls = type.__new__(meta, name, bases, class_dict)
        register_docs(cls)
        return cls

class RegDocs(metaclass=Meta):
    '''
    My Docs are here
    '''
    def __init__(self):
        pass

print(docs)

{'RegDocs': '\n My Docs are here\n '}

是否有一种方法可以在__init__.py中执行类似的操作,或者是否可以使用“元函数”对平面方法文件执行此操作?我希望能够访问一个global,它具有与以下示例类似的方法信息,该方法在调用之前会对方法进行了一些初始化。

func_info = {}

@metafunc
def foo():
  """
  My foo docs
  """
  pass
  
print(func_info)

> {'foo':'\n  My foo docs\n '}

1 个答案:

答案 0 :(得分:1)

您可以写一个decorator

func_info = {}

def metafunc(func):
    func_info[func.__name__] = func.__doc__
    return func

@metafunc
def foo():
  """
  My foo docs
  """
  pass

print(func_info)
# {'foo': '\n  My foo docs\n  '}

这具有also working on classes的优势:

@metafunc
class RegDocs(metaclass=Meta):
    '''
    My Docs are here
    '''
    def __init__(self):
        pass

print(func_info)
# {'foo': '\n  My foo docs\n  ', 'RegDocs': '\n    My Docs are here\n    '}