锱铢必较:在python中像java一样反射——动态实例化指定包下面所有的类

锱铢必较:在python中像java一样反射——动态实例化指定包下面所有的类 

转载:https://www.jianshu.com/p/912b53d6d957

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#    @version : 0.0.1
#    @File    : demo4.py
#    @Time    : 2019/8/8 15:13
#    @Site    : 
#    @Software: PyCharm
#    @Author  : KANGXINWEN
#    @Author_email: singbogo@163.com
#    @description: 
"""
在项目中需要在python中把某个包下面所有的类都实例化一个对象,把这些对象放到一个集合中,在java中可以通过反射机制来实现,先获得这个包下面所有的Class,然后利用class的构造函数来实例化对象
python则需要pkgutil,importlib,inspect模块的帮助
假设要操作的python包是bar,代码如下
pkgutil用来遍历package和module,用importlib来import module,在module中查找是class的member,调用class来实例化
"""
import pkgutil
import importlib
from inspect import getmembers, isclass

import bar

result=[]
for importer, name, ispkg in pkgutil.walk_packages(bar.__path__, "%s." % bar.__name__):
    if not ispkg:
        module=importlib.import_module(name)
        object_list = [value() for (_, value) in getmembers(module) if isclass(value)]
        result.extend(object_list)
print(result)
for o in result:
    cls_obj = o
    # 查看对象属性
    for attr in dir(cls_obj):
        # 加载非__前缀的属性
        if attr[0] != '_':
            # 获取导入obj方法。
            class_attr_obj = getattr(cls_obj, attr)

            # 判断类属性是否为函数
            if hasattr(class_attr_obj, '__call__'):
                # 执行函数
                class_attr_obj()

[<bar.p1.Child.Child object at 0x00000000041AF908>, <bar.p1.Child.Parent object at 0x00000000041AF8D0>, <bar.p2.Child.Child object at 0x00000000041AFDA0>, <bar.p3.Child.Child object at 0x0000000004190080>]
name is Liliy
name is Liliy-Parent
name is Tom
name is Lucy
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值