如何在python中发现特定包中的类? [英] How can I discover classes in a specific package in python?

查看:37
本文介绍了如何在python中发现特定包中的类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个插件风格的模块包.它看起来像这样:

<前>/插件/插件/__init__.py/插件/插件1.py/插件/插件2.py等等...

每个 .py 文件都包含一个派生自 PluginBaseClass 的类.所以我需要列出Plugins 包中的每个模块,然后搜索任何实现PluginBaseClass 的类.理想情况下,我希望能够做这样的事情:

 for klass in iter_plugins(project.Plugins):动作 = klass()动作.运行()

我已经看到了其他一些答案,但我的情况有所不同.我有一个对基础包的实际导入(即:import project.Plugins),我需要在发现模块后找到这些类.

解决方案

扫描模块不是个好主意.如果您需要类注册表,您应该查看 metaclasses 或使用现有的解决方案,如 zope.interface.通过元类的简单解决方案可能如下所示:

from functools import reduce类 DerivationRegistry(类型):def __init__(cls,name,bases,cls_dict):type.__init__(cls,name,bases,cls_dict)cls._subclasses = set()对于基中基:if isinstance(base,DerivationRegistry):base._subclasses.add(cls)def getSubclasses(cls):返回reduce(set.union,( succ.getSubclasses() for succ in cls._subclasses if isinstance(succ,DerivationRegistry)),cls._subclasses)类基础(对象):__metaclass__ = DerivationRegistry类 Cls1(对象):经过类 Cls2(基础):经过类 Cls3(Cls2,Cls1):经过类 Cls4(Cls3):经过打印(Base.getSubclasses())

I have a package of plug-in style modules. It looks like this:

/Plugins 
/Plugins/__init__.py
/Plugins/Plugin1.py
/Plugins/Plugin2.py 
etc...

Each .py file contains a class that derives from PluginBaseClass. So I need to list every module in the Plugins package and then search for any classes that implement PluginBaseClass. Ideally I want to be able to do something like this:

for klass in iter_plugins(project.Plugins):
    action = klass()
    action.run()

I have seen some other answers out there, but my situation is different. I have an actual import to the base package (ie: import project.Plugins) and I need to find the classes after discovering the modules.

解决方案

Scanning modules isn't good idea. If you need class registry you should look at metaclasses or use existing solutions like zope.interface. Simple solution through metaclasses may look like that:

from functools import reduce
class DerivationRegistry(type):
    def __init__(cls,name,bases,cls_dict):
        type.__init__(cls,name,bases,cls_dict)
        cls._subclasses = set()
        for base in bases:
            if isinstance(base,DerivationRegistry):
                base._subclasses.add(cls)

    def getSubclasses(cls):
        return reduce( set.union,
                       ( succ.getSubclasses() for succ  in cls._subclasses if isinstance(succ,DerivationRegistry)),
                       cls._subclasses)

class Base(object):
    __metaclass__ = DerivationRegistry

class Cls1(object):
    pass

class Cls2(Base):
    pass

class Cls3(Cls2,Cls1):
    pass

class Cls4(Cls3):
    pass

print(Base.getSubclasses())

这篇关于如何在python中发现特定包中的类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆