有没有办法在python的class被load的时候触发一个函数
大家讲道理
大家讲道理 2017-04-17 17:34:46
[Python讨论组]

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

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

但是有更好的方法吗?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
天蓬老师

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

巴扎黑

你说的这个是有一个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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号