扫码关注官方订阅号
我想在class被load的时候,把这个class注册到一个manager里面,就像http handler注册到handler manager里面一样。
http handler
handler manager
其他的方法比如用map来对应这些类和字符串的关系也是可行的,在class定义后面调用注册函数也是可以的
但是有更好的方法吗?
光阴似箭催人老,日月如移越少年。
可以考虑写一个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
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
可以考虑写一个Decorator把这个类包起来,或者写一个函数完成实例化一个类,注册和返回这个类的事情。
你说的这个是有一个PEP规范的import hook,见 http://www.python.org/dev/peps/pep-0302
具体代码为
postimport.py
调用方:
myTest.py