当前位置:  开发笔记 > 编程语言 > 正文

Python实例化模块中的所有类

如何解决《Python实例化模块中的所有类》经验,为你挑选了1个好方法。

我工作的一个基于文本的冒险游戏,并拥有一个具有所有的动作类,例如模块Move(Action),Look(Action).我需要一种方法,将模块中作为类的子类的所有类实例Action化为如下列表:

actions = [Move(), Look()]

有没有办法做到这一点,而无需通过键入他们的名称单独实例化类?



1> Mike Müller..:

这有效:

class Action:
    pass

class Move(Action):
    pass

class Look(Action):
    pass


actions = []
global_objs = list(globals().items())

for name, obj in global_objs:
    if obj is not Action and isinstance(obj, type) and issubclass(obj, Action):
        actions.append(obj())
print(actions)

打印:

[<__main__.Move object at 0x101916ba8>, <__main__.Look object at 0x101916be0>]

脚步

首先,我们将所有名称作为当前模块中的对象:

global_objs = list(globals().items())

我们需要转换为一个列表,因为在Python 3中 items()返回一个反映底层字典中的更改的dictview对象.由于我们在同一模块中工作,因此定义新对象将更改此字典.转换为列表可以解决此问题.

接下来,我们浏览所有对象.他们需要满足三个条件才能成为子类Action:

    obj is not Action- 既然Action是它自己的子类,我们需要将其过滤掉.

    isinstance(obj, type) - 对象必须是一个类.否则,3下的测试是不可能的.

    issubclass(obj, Action) - 最后,我们可以进行子类测试.

现在我们可以创建所有过滤类的实例并将它们附加到我们的列表中:

actions.append(obj())

更短的版本

如果您确定所有类都在一个模块中定义,或者您甚至希望所有子类分布在多个模块上,那么这将更短:

>>> actions = [obj() for obj in Action.__subclasses__()]
>>> actions
[<__main__.Move at 0x10fc14fd0>, <__main__.Look at 0x10fc14668>]

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有