首页 > 解决方案 > 有没有办法制作元函数/元初始化器?

问题描述

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

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 '}

标签: pythonpython-3.xinitialization

解决方案


你可以写一个装饰器

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  '}

这还具有在类上工作的优点:

@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    '}

推荐阅读