首页 > 有没有办法在python的class被load的时候触发一个函数

有没有办法在python的class被load的时候触发一个函数

我想在class被load的时候,把这个class注册到一个manager里面,
就像http handler注册到handler manager里面一样。

其他的方法比如用map来对应这些类和字符串的关系也是可行的,
在class定义后面调用注册函数也是可以的

但是有更好的方法吗?


你说的这个是有一个PEP规范的import hook,见 http://www.python.org/dev/peps/pep-0302
具体代码为

postimport.py

# -*- coding: utf-8 -*-

import importlib
import sys
from collections import defaultdict

_post_import_hooks = defaultdict(list)


class PostImportFinder:
    def __init__(self):
        self._skip = set()

    def find_module(self, fullname, path=None):
        if fullname in self._skip:
            return None
        self._skip.add(fullname)
        return PostImportLoader(self)


class PostImportLoader:
    def __init__(self, finder):
        self._finder = finder

    def load_module(self, fullname):
        importlib.import_module(fullname)
        module = sys.modules[fullname]
        for func in _post_import_hooks[fullname]:
            func(module)
        self._finder._skip.remove(fullname)
        return module


def when_imported(fullname):
    def decorate(func):
        if fullname in sys.modules:
            func(sys.modules[fullname])
        else:
            _post_import_hooks[fullname].append(func)
        return func

    return decorate


sys.meta_path.insert(0, PostImportFinder())

调用方:
myTest.py

from postimport import when_imported

@when_imported("PyQt4")
def warn(mod):
    print "are you sure you want to import " + str(mod)


import PyQt4
这样当PyQt4模块被导入的时候,会触发被装饰器when_imported修饰的函数warn

可以考虑写一个Decorator把这个类包起来,或者写一个函数完成实例化一个类,注册和返回这个类的事情。

【热门文章】
【热门文章】