面试题答案
一键面试实现思路
- 元编程定义插件基类:使用元类来定义插件的基类,确保所有插件都具有统一的接口。元类可以在类定义时进行一些预处理,比如注册插件。
- 反射实现动态加载:利用Python的反射机制(
getattr
、importlib
等),在运行时根据配置动态加载插件模块,并实例化插件类。
关键代码示例
import importlib
# 定义元类
class PluginMeta(type):
def __init__(cls, name, bases, attrs):
super().__init__(name, bases, attrs)
if not hasattr(cls, 'plugins'):
cls.plugins = []
else:
cls.plugins.append(cls)
# 定义插件基类,使用元类
class Plugin(metaclass=PluginMeta):
def execute(self):
raise NotImplementedError
# 示例插件1
class ExamplePlugin1(Plugin):
def execute(self):
print("ExamplePlugin1 is executed")
# 示例插件2
class ExamplePlugin2(Plugin):
def execute(self):
print("ExamplePlugin2 is executed")
# 动态加载插件模块
def load_plugins(plugin_names):
plugins = []
for plugin_name in plugin_names:
try:
module = importlib.import_module(plugin_name)
for _, cls in module.__dict__.items():
if isinstance(cls, type) and issubclass(cls, Plugin) and cls is not Plugin:
plugins.append(cls())
except ImportError:
print(f"Failed to import plugin {plugin_name}")
return plugins
# 配置要加载的插件
plugin_names = ['__main__', 'other_plugin_module']
loaded_plugins = load_plugins(plugin_names)
# 执行插件
for plugin in loaded_plugins:
plugin.execute()
在上述代码中:
PluginMeta
元类用于注册所有继承自Plugin
的子类。Plugin
类是所有插件的基类,定义了统一的接口execute
。ExamplePlugin1
和ExamplePlugin2
是具体的插件示例。load_plugins
函数使用importlib
动态加载插件模块,并利用反射查找模块中的插件类并实例化。最后遍历加载的插件并执行其execute
方法。实际项目中,plugin_names
可从配置文件读取,other_plugin_module
需替换为实际插件模块路径。